Jetpack Compose Academy · Урок

Одноразовые события с каналами

Безопасно передавайте события навигации и всплывающих сообщений.

Урок 4 из 413 шагов

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

Состояние — не событие

Некоторые действия должны выполняться ровно один раз — например, переход на другой экран или показ всплывающего сообщения. Представление их как состояния приводит к повторному запуску при каждом повороте экрана.

Проблема повторного воспроизведения

Если хранить сообщение для панели уведомлений в StateFlow, изменение конфигурации снова считывает его, и сообщение неожиданно появляется повторно.

Знакомство с Channel

Channel — это горячий канал, в котором каждое значение доставляется ровно одному получателю и затем потребляется, не воспроизводясь повторно.

private val _events = Channel<UiEvent>()

Отправка и выдача

Вы помещаете значение в Channel с помощью send — приостанавливающего вызова. Событие ждёт в буфере, пока не появится готовый получатель.

_events.send(UiEvent.NavigateBack)

Предоставление в виде потока

Преобразуйте канал в поток для UI с помощью receiveAsFlow, который позволяет ровно одному получателю потребить каждое событие.

val events = _events.receiveAsFlow()

Потреблено один раз — навсегда

Когда получатель забирает событие из Channel, оно исчезает. При следующем повороте экрана его уже нельзя прочитать, поэтому случайного повторного воспроизведения не будет.

Представление событий в виде типа

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

sealed interface UiEvent {
    data class ShowToast(val msg: String) : UiEvent
}

Сбор событий в Compose

Собирайте поток событий внутри LaunchedEffect, чтобы связать его с жизненным циклом экрана и обработать каждое событие один раз.

LaunchedEffect(Unit) {
    events.collect { handle(it) }
}

Выбор политики буфера

Стандартный Channel приостанавливает отправителя, если никто не получает данные. Вы можете задать ему буфер, чтобы отправки никогда не блокировали логику.

Channel<UiEvent>(Channel.BUFFERED)

SharedFlow — альтернатива

SharedFlow с нулевым количеством повторов также может передавать события, но Channel гарантирует доставку одному получателю даже при отсутствии активного получателя.

Разделяйте состояния и события

Чистый шаблон: один StateFlow для состояния экрана и один Channel для одноразовых событий. Теперь их невозможно перепутать.

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

Определите, что подходит для одноразового действия.

Повторение: одноразовые события

Замечательно! Channel доставляет одноразовые события, такие как переходы и всплывающие сообщения, ровно один раз, отделяя их от состояния экрана, которое можно воспроизводить повторно. 🎯

Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

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

Курсы
30
Уроки
120

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

Урок «Одноразовые события с каналами» бесплатный?

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

Чему я научусь в уроке «Одноразовые события с каналами»?

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

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

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

Сколько времени занимает урок «Одноразовые события с каналами»?

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

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

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

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

  1. StateFlow и SharedFlow
  2. Отображение и объединение потоков
  3. stateIn и WhileSubscribed
  4. Одноразовые события с каналами
← Назад к Jetpack Compose Academy