想定する画面要件(共通) Reducer を使わない場合 UI State ViewModel 特徴 Reducer を使う場合 UI State(同じ) Event Reducer(状態遷移の定義) ViewModel(StateHolder) 特徴 どちらを選ぶべきか Reducer を使わない方がよい場合 Reducer を使う価値が出る場合 この章のまとめ この章では、同じ要件の画面を題材に、
Reducer パターンを 使わない場合 Reducer パターンを 使う場合 の 2 つの実装を比較します。
目的は、 Reducer が「必要になる瞬間」がどこにあるのかを体感すること です。
想定する画面要件(共通) 初期表示時にデータを読み込む 読み込み中はローディング表示 成功したら一覧を表示 失敗したらエラーメッセージを表示 よくある、シンプルだが 状態は 3 種類ある画面 です。
Reducer を使わない場合 UI State data class UiState( val isLoading: Boolean = false, val items: List<Item> = emptyList(), val error: String? = null ) ViewModel class SampleViewModel( private val repository: ItemRepository ) : ViewModel() { private val _state = MutableStateFlow(UiState()) val state: StateFlow<UiState> = _state fun load() { _state.update { it.copy(isLoading = true, error = null) } viewModelScope.launch { runCatching { repository.loadItems() }.onSuccess { items -> _state.update { it.copy( isLoading = false, items = items ) } }.onFailure { e -> _state.update { it.copy( isLoading = false, error = e.message ) } } } } } 特徴 コード量が少ない 処理の流れが直線的で追いやすい 小規模な画面では十分に読みやすい 一方で、
...