MVI – это архитектурный подход, в котором экран работает через один предсказуемый поток данных: UI отправляет Intent, ViewModel обрабатывает его, обновляет Model, а Screen заново рисуется по новому состоянию. Для одноразовых действий вроде Snackbar или навигации используется отдельный Event.

Основной поток

Screen -> Intent -> ViewModel -> Model -> Screen
                       |
                       v
                     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.

Базовые типы