Что такое SharedFlow и чем он отличается от StateFlow?
Answer from AI
sobes.tech AI
SharedFlow и StateFlow — это оба типа потоков из библиотеки kotlinx.coroutines, предназначенные для реактивного программирования и управления асинхронными потоками данных, но они имеют разные цели и поведение.
StateFlow — это поток, который всегда содержит текущее состояние (value). Он похож на Observable с последним значением, которое можно получить в любой момент. StateFlow всегда хранит одно актуальное значение и при подписке сразу эмитит это значение. Это удобно для представления состояния UI или других данных, которые должны иметь текущее значение.
SharedFlow — это более общий поток, который может иметь несколько подписчиков и не хранит состояние по умолчанию. Он может быть настроен с буфером и политиками повторной отправки событий (replay). SharedFlow используется для широковещательной передачи событий, которые не обязательно должны иметь текущее значение, например, события навигации, уведомления или одноразовые сигналы.
Ключевые отличия:
- StateFlow всегда содержит текущее состояние, SharedFlow — нет (если replay=0).
- StateFlow при подписке сразу выдает текущее значение, SharedFlow — только если настроен replay.
- SharedFlow более гибкий и подходит для событий, StateFlow — для состояния.
Пример использования StateFlow:
val stateFlow = MutableStateFlow(0)
// Обновление состояния
stateFlow.value = 1
// Подписка
stateFlow.collect { value ->
println("Current value: $value")
}
Пример SharedFlow с replay:
val sharedFlow = MutableSharedFlow<Int>(replay = 1)
// Эмитим событие
sharedFlow.emit(42)
// Новый подписчик получит последнее событие благодаря replay
sharedFlow.collect { event ->
println("Received event: $event")
}