ViewModel に触れるのは Route だけにする

Updated 2022-05-10 Android · Jetpack Compose

Compose の画面は5つの層に分かれる のうち、Route は状態ホイスティングして ViewModel にイベントを伝える層である。逆に言えば、ViewModel のメソッドは Route で呼び出し、Screen 以下からは呼び出さない。

なぜ接続点を1箇所に寄せるか

Screen 以下が ViewModel を直接触れると、その Composable は特定の ViewModel なしには動かなくなる。部品として再利用もプレビューもできない。

接続点を Route に集約すると、Screen 以下は「渡された値を表示し、起きたことをコールバックで上に返す」だけの存在になる。これは 表示に使ってよいのは UiState だけ という制約を成立させる前提でもある。

Route は Activity/Fragment の代わり

役割で見ると、Route は今までの Activity/Fragment に近い位置にいる。画面全体に責任を持ち、外部(ViewModel、ナビゲーション、レスポンシブ判定)との接続を引き受ける。

「どこで ViewModel を触るか」で迷ったら、Activity/Fragment に書いていたかどうかを考えると判断しやすい。

このノートにリンクしているノート

  • Compose の画面は5つの層に分かれる
  • 表示に使ってよいのは UiState だけ
Michiaki Mizoguchi

Michiaki Mizoguchi

Software Developer / Engineering Manager

Home Notes Resume GitHub