Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpFwSt 197 of 299 menu
◀ ▶

Хранимое состояние в 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 на единицу через присваивание, затем запустите сбор и выведите итоговое число.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить