Отладка Kotlin Flow с помощью IntelliJ IDEA – руководство
В этом руководстве показано, как создавать Kotlin Flow и отлаживать его с помощью IntelliJ IDEA.
Для выполнения этого руководства предполагается, что вы знакомы с концепциями корутин и Kotlin Flow.
Создание Kotlin flow
Создайте Kotlin flow с медленным генератором и медленным коллектором:
Откройте Kotlin-проект в IntelliJ IDEA. Если у вас нет проекта, создайте его.
-
Для использования библиотеки
kotlinx.coroutinesв проекте Gradle добавьте следующую зависимость вbuild.gradle(.kts):dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1") }dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1' }Для других систем сборки см. инструкции в
kotlinx.coroutinesREADME. -
Откройте файл
Main.ktвsrc/main/kotlin.Директория
srcсодержит Kotlin-исходные файлы и ресурсы. ФайлMain.ktсодержит пример кода, который выведетHello World!. -
Создайте функцию
simple(), которая возвращает поток из трех чисел:Используйте функцию
delay(), чтобы имитировать ресурсоемкий блокирующий код. Она приостанавливает корутину на 100 мс, не блокируя поток.Выведите значения в цикле
for, используя функциюemit().
import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import kotlin.system.* fun simple(): Flow<Int> = flow { for (i in 1..3) { delay(100) emit(i) } } -
Измените код в функции
main():Используйте блок
runBlocking()для обертывания корутины.Соберите выводимые значения, используя функцию
collect().Используйте функцию
delay(), чтобы имитировать ресурсоемкий код. Она приостанавливает корутину на 300 мс, не блокируя поток.Выведите собранное значение из потока, используя функцию
println().
fun main() = runBlocking { simple() .collect { value -> delay(300) println(value) } } -
Соберите код, нажав Собрать проект.
Отладка корутины
-
Установите точку останова на строке, где вызывается функция
emit(): -
Запустите код в режиме отладки, нажав Отладка рядом с конфигурацией запуска в верхней части экрана.
Окно отладки Отладка появляется:
Вкладка Фреймы содержит стек вызовов.
Вкладка Переменные содержит переменные в текущем контексте. Она показывает, что поток выводит первое значение.
Вкладка Корутины содержит информацию о выполняемых или приостановленных корутинах.

-
Возобновите сеанс отладки, нажав Возобновить программу в окне отладки Отладка. Программа остановится на той же точке останова.
Теперь поток выводит второе значение.

Оптимизированные переменные
Если вы используете функции suspend, в отладчике вы можете увидеть текст «была оптимизирована» рядом с именем переменной:
Это означает, что срок жизни переменной был уменьшен, и переменная больше не существует. Отладка кода с оптимизированными переменными затруднена, поскольку вы не видите их значения. Вы можете отключить это поведение с помощью опции компилятора -Xdebug.
Добавление корутины, выполняющейся параллельно
Откройте файл
Main.ktвsrc/main/kotlin.-
Улучшите код для параллельной работы генератора и коллектора:
Добавьте вызов функции
buffer(), чтобы запустить генератор и коллектор параллельно.buffer()хранит выведенные значения и запускает коллектор потока в отдельной корутине.
fun main() = runBlocking<Unit> { simple() .buffer() .collect { value -> delay(300) println(value) } } Соберите код, нажав Собрать проект.
Отладка Kotlin flow с двумя корутинами
Установите новую точку останова в
println(value).-
Запустите код в режиме отладки, нажав Отладка рядом с конфигурацией запуска в верхней части экрана.

Появится окно отладки Отладка.
В вкладке Корутины вы увидите, что две корутины выполняются параллельно. Коллектор и генератор потока работают в отдельных корутинах из-за функции
buffer(). Функцияbuffer()буферизует выводимые значения из потока. Корутина генератора имеет статус ВЫПОЛНЯЕТСЯ, а корутина коллектора имеет статус ПРИОСТАНОВЛЕНА. -
Возобновите сеанс отладки, нажав Возобновить программу в окне отладки Отладка.

Теперь корутина коллектора имеет статус ВЫПОЛНЯЕТСЯ, а корутина генератора — ПРИОСТАНОВЛЕНА.
Вы можете углубиться в каждую корутину для отладки вашего кода.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/debug-flow-with-idea.html