Как в MVI реализовать загрузку списка

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

Ответ

В MVI загрузка списка реализуется через односторонний поток данных:

  1. Intent - пользовательское действие (например, открытие экрана)
sealed class Intent {
    object LoadList : Intent()
}
  1. Model - состояние экрана:
data class State(
    val isLoading: Boolean = false,
    val items: List<Item> = emptyList(),
    val error: String? = null
)
  1. Reducer обрабатывает интенты и обновляет состояние:
fun reduce(state: State, intent: Intent): State {
    return when(intent) {
        is Intent.LoadList -> state.copy(isLoading = true)
        // другие кейсы
    }
}
  1. Эффекты (side effects) - загрузка данных в репозитории:
suspend fun loadItems(): Flow<Result<List<Item>> {
    return repository.getItems()
        .map { Result.success(it) }
        .catch { emit(Result.failure(it)) }
}

Ключевые моменты:

  • Состояние immutable
  • Все изменения через reducer
  • Side effects вынесены отдельно
  • UI просто отражает текущее состояние