Что такое SharedFlow и чем он отличается от StateFlow?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
SharedFlow — это горячий поток для рассылки событий нескольким подписчикам. StateFlow — это частный случай горячего потока, который всегда хранит текущее состояние и сразу отдает его новым подписчикам. Основное отличие: SharedFlow удобен для событий, StateFlow — для состояния с последним значением по умолчанию.
Определение:
SharedFlow — это Flow, который может быть собран несколькими подписчиками одновременно и не привязан к жизненному циклу отдельного коллектора. Он подходит для одноразовых событий, например навигации, тостов, аналитики или сигналов обновления.
StateFlow — это специализированный SharedFlow для хранения и распространения состояния. У него всегда есть актуальное значение, которое доступно через value, и любой новый подписчик сразу получает последнее состояние.
Ключевое отличие в семантике:
SharedFlowможет быть без начального значения и может не хранить состояние.StateFlowвсегда имеет текущее значение и предназначен именно для state management.SharedFlowчасто используют для событий,StateFlow— для UI-состояния.
Пример использования:
class MyViewModel : ViewModel() {
private val _events = MutableSharedFlow<String>()
val events = _events.asSharedFlow()
private val _uiState = MutableStateFlow("Loading")
val uiState = _uiState.asStateFlow()
fun onButtonClick() {
viewModelScope.launch {
_events.emit("NavigateToDetails")
}
}
fun loadData() {
_uiState.value = "Content loaded"
}
}
Пояснение кода:
В примере MutableSharedFlow используется для события NavigateToDetails. Это одноразовый сигнал: его не нужно хранить как состояние, и новый подписчик не обязан его получить задним числом.
MutableStateFlow используется для uiState. Это текущее состояние экрана: Loading — начальное значение, затем оно меняется на Content loaded. Любой новый подписчик сразу увидит последнее значение "Content loaded".
Если бы код был в UI:
- Подписчик на
eventsреагировал бы на навигацию или toast. - Подписчик на
uiStateобновлял бы экран при каждом изменении состояния. SharedFlowподходил бы для событий, которые не должны “залипать”.StateFlowподходил бы для данных, которые всегда должны быть доступны как текущее состояние.
Ключевые моменты:
SharedFlow— для событий,StateFlow— для состояния.StateFlowвсегда имеет текущее значение,SharedFlow— не обязательно.- Новый подписчик
StateFlowсразу получает последнее значение. SharedFlowудобен для одноразовых уведомлений и broadcast-сценариев.- Для UI-состояния в Android обычно выбирают
StateFlow, для effect-событий —SharedFlow.