Какой опыт работы с MVI

«Какой опыт работы с MVI» — вопрос из категории Архитектура, который задают на 31% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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.