← Назад к вопросам

Какие знаешь компоненты в MVI?

3.0 Senior🔥 111 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Компоненты паттерна MVI

В архитектуре MVI (Model-View-Intent) есть несколько ключевых компонентов, которые обеспечивают односторонний поток данных и предсказуемое состояние приложения. Вот основные из них:

1. Model (Модель)

Model представляет собой неизменяемое состояние (immutable state) приложения. В отличие от других паттернов, Model в MVI — это не сущность данных, а целостное состояние экрана или компонента. Он содержит все данные, необходимые для отображения UI.

data class UserState(
    val isLoading: Boolean = false,
    val user: User? = null,
    val error: String? = null
)

2. View (Представление)

View — это компонент, который отображает состояние Model и передает пользовательские действия в виде Intent. View обычно реализуется через Activity, Fragment или Composable-функцию в Jetpack Compose.

class UserActivity : AppCompatActivity(), UserView {
    override fun render(state: UserState) {
        when {
            state.isLoading -> showLoading()
            state.error != null -> showError(state.error)
            state.user != null -> showUser(state.user)
        }
    }
}

3. Intent (Намерение)

Intent — это не Android Intent, а абстракция, представляющая пользовательское действие или событие (например, нажатие кнопки, свайп). Intent передается в ViewModel или Presenter для обработки.

sealed class UserIntent {
    object LoadUser : UserIntent()
    data class UpdateUserName(val name: String) : UserIntent()
    object RefreshUser : UserIntent()
}

4. ViewModel / Presenter / Interactor

Этот компонент обрабатывает Intent, взаимодействует с репозиториями или use cases, и производит новое состояние Model. Он служит посредником между View и бизнес-логикой.

class UserViewModel : ViewModel() {
    private val _state = MutableStateFlow(UserState())
    val state: StateFlow<UserState> = _state.asStateFlow()

    fun processIntent(intent: UserIntent) {
        when (intent) {
            is UserIntent.LoadUser -> loadUser()
            // Обработка других intent
        }
    }

    private fun loadUser() {
        _state.update { it.copy(isLoading = true) }
        // Вызов use case или репозитория
    }
}

5. Репозиторий / Use Case / Action

Эти компоненты отвечают за бизнес-логику — получение данных из API, базы данных или других источников. Они не зависят от UI и возвращают результат в ViewModel.

6. State Reducer (Редьюсер)

Reducer — это чистая функция, которая принимает предыдущее состояние и результат действия, возвращая новое состояние. Он обеспечивает предсказуемость изменений состояния.

fun userReducer(oldState: UserState, result: UserResult): UserState {
    return when (result) {
        is UserResult.Loading -> oldState.copy(isLoading = true)
        is UserResult.Success -> oldState.copy(
            isLoading = false,
            user = result.user
        )
        is UserResult.Error -> oldState.copy(
            isLoading = false,
            error = result.message
        )
    }
}

Ключевые особенности компонентов MVI:

  • Односторонний поток данных: Intent → ViewModel → Model → View
  • Неизменяемость состояния: Все изменения состояния происходят через создание новых объектов Model
  • Предсказуемость: Состояние полностью определяет UI, что упрощает отладку и тестирование
  • Реактивность: Компоненты реагируют на изменения состояния, обычно через StateFlow, LiveData или RxJava
  • Декларативность: View просто объявляет, как отображать состояние, не управляя логикой

Преимущества использования компонентов MVI:

  • Тестируемость: Каждый компонент можно тестировать изолированно
  • Масштабируемость: Легко добавлять новые функции, расширяя состояния и интенты
  • Отладка: Возможность логировать все состояния и интенты для анализа проблем
  • Согласованность UI: Гарантируется, что UI всегда соответствует текущему состоянию

MVI особенно эффективен в сложных Android-приложениях с большим количеством состояний и пользовательских взаимодействий, где важно поддерживать предсказуемость и управляемость кода.

Какие знаешь компоненты в MVI? | PrepBro