Ответ
MVI (Model-View-Intent) — это архитектурный паттерн, основанный на однонаправленном потоке данных. В Android его часто реализуют с помощью Kotlin Coroutines и StateFlow.
Ключевые моменты:
- Intent — действия пользователя (например, клик).
- State — immutable состояние UI.
- Reducer — чистая функция, которая генерирует новое состояние на основе предыдущего и события.
Пример:
sealed class MainIntent {
object LoadData : MainIntent()
}
data class MainState(val isLoading: Boolean, val data: List<String>)
class MainViewModel : ViewModel() {
private val _state = MutableStateFlow(MainState(false, emptyList()))
val state: StateFlow<MainState> = _state
fun processIntent(intent: MainIntent) {
when (intent) {
is MainIntent.LoadData -> loadData()
}
}
private fun loadData() = viewModelScope.launch {
_state.update { it.copy(isLoading = true) }
val data = repository.fetchData()
_state.update { it.copy(isLoading = false, data = data) }
}
}
Плюсы:
- Предсказуемость (одно состояние).
- Легко тестировать (редьюсеры — чистые функции).
- Отсутствие side-эффектов.
Минусы:
- Больше boilerplate-кода.
- Сложность при работе с навигацией/диалогами.
Использовал в проектах с RxJava/Coroutines + StateFlow.