Как моделировать состояние и события экрана
Вопрос
Как вы моделируете состояние экрана и одноразовые события (навигация, тосты) во view model?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Состояние: закрытая иерархия (enum, sealed) вместо набора флагов
Одно неизменяемое значение в наблюдаемом контейнере (StateFlow, @Observable, Stream)
События: проблема повторной доставки при пересоздании view
Варианты: событие в состоянии с подтверждением обработки или отдельный канал
Навигацию передавать координатору через колбэк, а не как событие UI
Сохранение состояния при смерти процесса
Что могут спросить следом
- Почему Google не рекомендует SharedFlow для событий?
- Как протестировать последовательность состояний?
Разбор
Состояние экрана описываю закрытой иерархией: Loading, Content(items, isRefreshing), Error(message), Empty. Так невозможные комбинации флагов просто нельзя выразить, а компилятор проверит, что view обработала все варианты. View model держит одно неизменяемое значение в наблюдаемом контейнере, и view только рисует его. С одноразовыми событиями сложнее: тост или переход не должны повториться после поворота или повторной подписки, но и потеряться не должны. Надёжный способ: событие часть состояния, view после обработки сообщает об этом, и view model его снимает. Отдельный канал проще, но событие может потеряться, если подписчика в этот момент нет. Навигацию я вообще не делаю событием UI: view model вызывает метод координатора. И не забываю про смерть процесса: ключевые параметры экрана сохраняю в SavedStateHandle или аналог.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «MVC, MVP, MVVM, MVI, VIPER»
- Выбор паттерна для небольшого приложения
- MVC, MVP, MVVM, MVI, VIPER коротко
- TCA, BLoC, Redux: общий принцип
- Что такое UDF
- Почему MVC в iOS называют Massive View Controller
- Кто за что отвечает в паттернах
- Однонаправленный поток данных в MVI
- Чем MVP отличается от MVVM