Выбор ответа Senior Архитектура: MVVM, MVI, Clean обновлено
Одноразовые события из ViewModel
Вопрос
Почему отправлять навигационное событие через MutableSharedFlow<Event>() (без replay) рискованно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Без подписчика в момент отправки (например, при повороте) событие потеряется. Без replay и буфера SharedFlow отдаёт значение только текущим подписчикам.
Варианты ответа
SharedFlowнельзя собирать в Compose без конвертации вStateчерезcollectAsState- Событие будет доставлено дважды: один раз старому, другой раз новому подписчику
SharedFlowэмитит только в фоновом потоке, а навигацию нужно вызывать на главном- Без подписчика в момент отправки (например, при повороте) событие потеряетсяправильный ответ
Разбор
Без replay и буфера SharedFlow отдаёт значение только текущим подписчикам. Во время поворота UI отписан, и событие уходит в никуда. Надёжнее Channel с receiveAsFlow(), который хранит событие до получателя, или событие как поле состояния, которое UI подтверждает после обработки. Собирать SharedFlow в Compose можно, дублей и фоновых ограничений нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.