Sobes.tech
Назад к вопросам
Middle+
428
questionbank

Что такое 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:

  1. Подписчик на events реагировал бы на навигацию или toast.
  2. Подписчик на uiState обновлял бы экран при каждом изменении состояния.
  3. SharedFlow подходил бы для событий, которые не должны “залипать”.
  4. StateFlow подходил бы для данных, которые всегда должны быть доступны как текущее состояние.

Ключевые моменты:

  • SharedFlow — для событий, StateFlow — для состояния.
  • StateFlow всегда имеет текущее значение, SharedFlow — не обязательно.
  • Новый подписчик StateFlow сразу получает последнее значение.
  • SharedFlow удобен для одноразовых уведомлений и broadcast-сценариев.
  • Для UI-состояния в Android обычно выбирают StateFlow, для effect-событий — SharedFlow.