Выбор ответа Senior Архитектура: MVVM, MVI, Clean обновлено

Одноразовые события из ViewModel

Вопрос

Почему отправлять навигационное событие через MutableSharedFlow<Event>() (без replay) рискованно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Без подписчика в момент отправки (например, при повороте) событие потеряется. Без replay и буфера SharedFlow отдаёт значение только текущим подписчикам.

Варианты ответа

  1. SharedFlow нельзя собирать в Compose без конвертации в State через collectAsState
  2. Событие будет доставлено дважды: один раз старому, другой раз новому подписчику
  3. SharedFlow эмитит только в фоновом потоке, а навигацию нужно вызывать на главном
  4. Без подписчика в момент отправки (например, при повороте) событие потеряетсяправильный ответ

Разбор

Без replay и буфера SharedFlow отдаёт значение только текущим подписчикам. Во время поворота UI отписан, и событие уходит в никуда. Надёжнее Channel с receiveAsFlow(), который хранит событие до получателя, или событие как поле состояния, которое UI подтверждает после обработки. Собирать SharedFlow в Compose можно, дублей и фоновых ограничений нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.