Ответ
MVI (Model-View-Intent) — это архитектурный паттерн для построения пользовательских интерфейсов, основанный на однонаправленном потоке данных и неизменяемом состоянии.
Ключевые компоненты:
- Model (Состояние): Единственный, неизменяемый (immutable) источник истины, описывающий состояние всего UI.
- View: Пассивно отображает текущее состояние и преобразует пользовательские действия в Intents.
- Intent: Намерение или событие (например, нажатие кнопки), которое описывает, что хочет сделать пользователь.
Принцип работы (цикл):
- View отправляет Intent.
- Система (Reducer/Processor) обрабатывает Intent на основе текущего Model и создает новый Model.
- Новый Model передается во View для отрисовки.
Пример на Kotlin:
// 1. Состояние (Model)
data class MainState(val isLoading: Boolean = false, val items: List<String> = emptyList())
// 2. Намерения (Intents)
sealed class MainIntent {
object LoadData : MainIntent()
data class DataLoaded(val items: List<String>) : MainIntent()
}
// 3. Редуктор (Reducer)
fun reduce(state: MainState, intent: MainIntent): MainState = when (intent) {
is MainIntent.LoadData -> state.copy(isLoading = true)
is MainIntent.DataLoaded -> state.copy(isLoading = false, items = intent.items)
}
Преимущества:
- Предсказуемость: Состояние иммутабельно и изменяется только в одном месте.
- Тестируемость: Легко тестируются чистые функции-редукторы и изолированное состояние.
- Декларативность: UI является функцией от состояния (
UI = f(state)).
Недостатки:
- Избыточность кода (boilerplate): Требуется описывать состояния, интенты и редьюсеры даже для простых экранов.
- Сложность: Кривая обучения выше по сравнению с MVVM.