ViewModel に触れるのは Route だけにする
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 に書いていたかどうかを考えると判断しやすい。