Какой бы Flow использовал для сохранения состояния

«Какой бы Flow использовал для сохранения состояния» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для сохранения состояния в Android лучше использовать StateFlow или SharedFlow из Kotlin Coroutines.

StateFlow – идеален для хранения UI-состояния:

  • Хранит текущее значение (initial state)
  • Автоматически эмитит последнее значение новым подписчикам
  • Потоково-безопасен (thread-safe)
private val _uiState = MutableStateFlow<UiState>(UiState.Loading)
val uiState: StateFlow<UiState> = _uiState.asStateFlow()

// Обновление состояния
_uiState.value = UiState.Success(data)

SharedFlow – когда нужно:

  • Кэшировать несколько событий (replay = n)
  • Обрабатывать одноразовые события (например, навигация/тосты)
  • Не хранить начальное состояние
private val _events = MutableSharedFlow<Event>()
val events = _events.asSharedFlow()

// Эмит события
_events.tryEmit(Event.ShowToast("Saved"))

Для ViewModel используйте stateIn с начальным состоянием:

val state = flow.stateIn(
    scope = viewModelScope,
    started = SharingStarted.WhileSubscribed(5000),
    initialValue = LoadingState
)