0Pricing
Android Academy · Урок

StateFlow и SharedFlow

Предоставляйте реактивное состояние из приложения

«StateFlow и SharedFlow» — бесплатный урок Android Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Горячие потоки

В отличие от холодных потоков, StateFlow и SharedFlow являются горячими: они существуют независимо от сборщиков и могут использоваться многими сборщиками.

StateFlow хранит состояние

StateFlow всегда хранит одно текущее значение. Новые сборщики сразу получают последнее значение. Это идеально подходит для состояния пользовательского интерфейса.

private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count.asStateFlow()

Обновление StateFlow

Задавайте .value напрямую или используйте update для атомарной операции чтения-изменения-записи.

_count.value++
// or, atomically:
_count.update { it + 1 }

StateFlow объединяет и удаляет дубликаты

StateFlow хранит только последнее значение (конфляция) и не выдаёт новое значение, если оно равно старому. Это предотвращает лишние обновления интерфейса.

SharedFlow для событий

У SharedFlow нет обязательного текущего значения, и он может повторно выдавать настраиваемое количество прошлых значений. Он подходит для одноразовых событий, таких как навигация или показ всплывающего сообщения.

private val _events = MutableSharedFlow<String>()
val events: SharedFlow<String> = _events.asSharedFlow()

Выдача событий

Выдавайте значения в SharedFlow из сопрограммы.

fun onSave() {
    viewModelScope.launch {
        _events.emit("Saved!")
    }
}

Почему для событий не следует использовать StateFlow

StateFlow хранит последнее значение, поэтому сборщик, подписавшийся снова (например, после поворота экрана), получит старое событие ещё раз и, например, выполнит навигацию дважды. SharedFlow по умолчанию не повторяет значения.

Настройка SharedFlow

Настройте replay и extraBufferCapacity, чтобы управлять буферизацией и поведением при переполнении.

MutableSharedFlow<String>(
    replay = 0,
    extraBufferCapacity = 1
)

Преобразование холодного потока в StateFlow

Используйте stateIn, чтобы преобразовать холодный вышестоящий поток в общий StateFlow, областью которого является ViewModel.

val uiState = repo.stream()
    .stateIn(
        viewModelScope,
        SharingStarted.WhileSubscribed(5000),
        UiState()
    )

Выбор между ними

  • StateFlow → текущее состояние экрана (значение есть всегда).
  • SharedFlow → временные события (срабатывают один раз).

Сбор значений обоих потоков

Собирайте StateFlow с помощью collectAsStateWithLifecycle в Compose; собирайте события SharedFlow внутри LaunchedEffect, чтобы обработать их один раз.

LaunchedEffect(Unit) {
    vm.events.collect { msg -> showSnackbar(msg) }
}

Быстрая проверка

Проверьте, насколько хорошо Вы поняли StateFlow и SharedFlow.

Итоги

Вы узнали:

  • StateFlow — горячий контейнер состояния с объединением значений и текущим значением.
  • SharedFlow — горячий поток событий с настраиваемым повторным воспроизведением.
  • Используйте StateFlow для состояния, а SharedFlow — для одноразовых событий.
  • stateIn преобразует холодные потоки в StateFlow.

Часто задаваемые вопросы

Урок «StateFlow и SharedFlow» бесплатный?

Да — полный текст урока «StateFlow и SharedFlow» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «StateFlow и SharedFlow»?

Предоставляйте реактивное состояние из приложения Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «StateFlow и SharedFlow»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы корутин и области видимости
  2. viewModelScope и диспетчеры
  3. Основы Kotlin Flow
  4. StateFlow и SharedFlow
← Назад к Android Academy