Ответ
В MVI загрузка списка реализуется через односторонний поток данных:
- Intent - пользовательское действие (например, открытие экрана)
sealed class Intent {
object LoadList : Intent()
}
- Model - состояние экрана:
data class State(
val isLoading: Boolean = false,
val items: List<Item> = emptyList(),
val error: String? = null
)
- Reducer обрабатывает интенты и обновляет состояние:
fun reduce(state: State, intent: Intent): State {
return when(intent) {
is Intent.LoadList -> state.copy(isLoading = true)
// другие кейсы
}
}
- Эффекты (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 просто отражает текущее состояние