MVI – это архитектурный подход, в котором экран работает через один предсказуемый поток данных: UI отправляет Intent, ViewModel обрабатывает его, обновляет Model, а Screen заново рисуется по новому состоянию. Для одноразовых действий вроде Snackbar или навигации используется отдельный Event.
Screen -> Intent -> ViewModel -> Model -> Screen
|
v
Event
Роли распределяются так:
Screen показывает состояние, отправляет intent и выполняет UI-события.Intent описывает действие пользователя или системный вход.ViewModel принимает intent, содержит логику и меняет состояние.Model хранит все данные, по которым рисуется экран.Event описывает одноразовое действие, которое не должно становиться частью состояния.Такой поток полезен, когда экран начинает расти: появляются загрузка, ошибки, несколько кнопок, формы, навигация, retry, фильтры или подписки на данные. Вместо набора разрозненных методов у экрана появляется единая точка входа – dispatch.
Общий MVI-слой:
mvi/
├── Intent.kt
├── Model.kt
├── Event.kt
├── EmptyModel.kt
├── CoroutineViewModel.kt
├── MviViewModel.kt
└── Lifecycle.kt
Пример feature-экрана:
feature/
├── FeatureScreen.kt
├── FeatureViewModel.kt
├── intent/FeatureIntent.kt
├── model/FeatureModel.kt
└── event/FeatureEvent.kt
Для нового экрана лучше сразу создавать такой же набор: Screen, ViewModel, Model, Intent и опционально Event.