В чём разница между flow{}, StateFlow, SharedFlow и Channel?

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() значение исчезает


Опубликовано

в

,

от

Метки: