Хранимое состояние в Kotlin
Холодный Flow каждый раз начинает с
нуля. StateFlow - горячий поток с
ячейкой памяти: в ней всегда лежит актуальное
значение, и новый collect сразу
получает его, не дожидаясь следующего
emit.
Запись идет через MutableStateFlow,
чтение для подписчиков - через
StateFlow или то же изменяемое
значение после публикации:
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val gauge = MutableStateFlow(0)
gauge.value = 5
gauge.take(1).collect { level ->
println(level)
}
}
}
Первым делом печатается 5 - текущее
содержимое ячейки. Сбор не простаивает в
ожидании первого события. Одного значения
хватает: без ограничения горячий поток не
заканчивается.
Второй сборщик видит уже обновленное состояние, если оно успело измениться:
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val label = MutableStateFlow("idle")
label.value = "busy"
label.take(1).collect { text -> println("A $text") }
label.value = "done"
label.take(1).collect { text -> println("B $text") }
}
}
Строка "A busy" отражает значение на
момент первого сбора. Второй сбор сразу
получает "done" - последнее записанное
в value, без повторного прогона
холодного строителя.
Создайте MutableStateFlow со
строкой "off", запишите "on"
и соберите поток один раз - должна
напечататься актуальная метка.
Счетчик начинается с 0. Дважды
увеличьте value на единицу через
присваивание, затем запустите сбор и
выведите итоговое число.