Ответ вслух Senior MVC, MVP, MVVM, MVI, VIPER обновлено

Как моделировать состояние и события экрана

Вопрос

Как вы моделируете состояние экрана и одноразовые события (навигация, тосты) во view model?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Состояние экрана описываю закрытой иерархией: Loading, Content(items, isRefreshing), Error(message), Empty. Так невозможные комбинации флагов просто нельзя выразить, а компилятор проверит, что view обработала все варианты.

Что должно прозвучать в ответе

  • Состояние: закрытая иерархия (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 ошибок.