Этот вопрос проверяет понимание различий между двумя типами потоков данных в Kotlin и их применение в реальных сценариях.
StateFlow хранит текущее состояние и отправляет его новым подписчикам. Он всегда имеет значение и подходит для управления UI-состоянием. SharedFlow не хранит состояние и просто транслирует события, без обязательного начального значения. Он подходит для одноразовых событий, например, уведомлений или действий.
1. StateFlow (Поток состояния)
Хранит текущее значение – при подписке новый получатель сразу получает последнее значение.
Требует начальное значение – нельзя создать StateFlow без initialValue.
Использует конфлюэнтную (объединённую) стратегию – если значение не меняется, подписчики не получают повторных событий.
Подходит для UI-состояния – например, отображение загрузки, ошибок или данных.
Пример:
val stateFlow = MutableStateFlow("Initial")
// Подписчик получит "Initial" сразу и далее только новые значения
stateFlow.collect { value -> println(value) }
stateFlow.value = "Updated" // Подписчик получит "Updated" 2. SharedFlow (Общий поток событий)
Не хранит состояние – новые подписчики не получают прошлых значений (если не используется replay).
Не требует начального значения – можно создать пустой SharedFlow.
Подходит для событий – например, нажатия кнопок, одноразовые уведомления.
Гибкость в настройке – можно задать replay (сколько прошлых событий отправлять новым подписчикам) и buffer (размер очереди).
Пример:
val sharedFlow = MutableSharedFlow<String>()
// Подписчик не получит ничего, пока не появится новое событие
sharedFlow.collect { event -> println(event) }
sharedFlow.emit("Event 1") // Подписчик получит "Event 1" Когда использовать?
StateFlow – для данных, которые должны всегда быть актуальными (например, состояние экрана).
SharedFlow – для событий, которые не нужно хранить (например, сообщения о действиях пользователя).