Skip to content

MVI ​

ライブラリは MVI(Model-View-Intent)パターンに従い、次のデータフローはデスクトップでもモバイルでも同じです。デスクトップのウィンドウでは、Container を通して ViewModel どうしが協調する Broadcast、Unicast、View Refresh の 3 つが加わります。モバイルには Container がないので、Broadcast のフローから View Refresh のフローまでの節はデスクトップだけのものです。

データフロー ​

Broadcast のフロー ​

複数の ViewModel が同じ出来事に反応する必要があるときは PulseContainer.broadcast() を使います。

Unicast のフロー ​

子の ViewModel が親の Container に知らせる必要があるときは PulseViewModel.unicast() を使います。

View Refresh のフロー ​

Container.refresh() は Compose のビューツリーを強制的に再構築します。ViewModel の状態は保持され、Composable だけが作り直されます。

各コンポーネントの責務 ​

コンポーネント責務
PulseStateUI データの不変スナップショット
PulseActionユーザーの意図 — ユーザーが何をしたいか
PulseEvent一度きりの副作用 — ナビゲーション、ダイアログ、スナックバー
PulseBroadcastContainer から ViewModel 群への横断的な通知(デスクトップ)
PulseUnicastViewModel から親への通知(デスクトップ)
PulseViewModel状態を所有し、Action と Broadcast を処理し、Unicast を発行できる
PulseContainerViewModel 群を調整し、Broadcast・Unicast 処理・Refresh を提供する(デスクトップ)
PulseHostContainer のキーを伝播する Compose ラッパー(デスクトップ)
PulseContentViewModel を観測する Compose ラッパー

ライフサイクル ​

TIP

onSetup() は、PulseContent が ViewModel を最初に観測したときに一度だけ実行されます。ViewModel は ViewModelStoreOwner が生きている間ずっと有効です。コンポジションの再起動でも refresh() でも、セットアップは繰り返されません。

どのオーナーかによって、ViewModel の寿命が決まります。

  • ホストのオーナー配下で生成すれば、画面全体の間生き続けます
  • Navigation 3 の destination の中で生成すれば、そのバックスタックエントリにスコープされます。別の destination で覆われても保持され、ルートが pop されるとキャンセルされます

デモはすべての destination を後者の方法で構築しています。詳しくは Navigation 3 を参照してください。

Apache 2.0 License の下で公開されています。