Flow {} — холодный поток
fun getFlow(): Flow<Int> = flow {
emit(1)
emit(2)
}
- Стартует только при collect
- Каждый
collector получает свою копию
- Полезен для последовательных значений (например, БД, API)
StateFlow — горячий поток с состоянием
val state = MutableStateFlow(0)
state.value = 1
- Постоянно активен
- Сохраняет последнее значение
- Каждый новый подписчик сразу получает текущее состояние
- Аналог
LiveData, но в корутинном стиле
- Используется в ViewModel для UI-состояний
SharedFlow — горячий поток для событий
val shared = MutableSharedFlow<Int>(replay = 1)
shared.emit(42)
- Работает как broadcast
- Можно настроить
replay и буфер
- Подписчики могут не получить событие, если подписались поздно (если
replay=0)
- Используется для одноразовых событий: навигация, тосты, ошибки
Channel — двусторонняя труба
val channel = Channel<Int>()
launch { channel.send(1) }
launch { val x = channel.receive() }
- Служит как очередь сообщений между coroutine producer ↔ consumer
- Работает как «mailbox»
send() приостановится, если буфер заполнен (или никто не receive)
- После
receive() значение исчезает