ViewModelとCreationExtras

Kenji Abe
Feb 25, 2022
Photo by Alex Shute on Unsplash

Lifecycle ViewModel 2.5.0-alpha01 に CreationExtras が追加されました。この CreationExtras について使い方などを紹介したいと思います。

CreationExtrasViewModelProvider.Factory に追加の情報として渡すことのできるMapのようなものになっています。また、 ViewModelProvider.Factory が状態を持つことなく値を渡すことが可能なります。

※これを書いてる時点ではalphaなので今後変更があるかもです。

環境

  • androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.0-alpha03
  • androidx.fragment:fragment-ktx:1.5.0-alpha03

Composeの場合

  • androidx.activity:activity-compose:1.5.0-alpha03
  • androidx.lifecycle:lifecycle-viewmodel-compose:2.5.0-alpha03

使い方

Activityで以下のようなViewModelを生成する例です。

単純な引数を渡す方法は以下のような感じになります。ちょっと長いですが。

CreationExtras.Key

CreationExtras.KeyCreationExtras で使用するKeyになります。型パラメータの型が実際に設定したい型になります。この場合はIntになります。

CreationExtrasの作成

CreationExtras を作成して値を設定するには MutableCreationExtras を使用します。Keyには CreationExtras.Key のものを指定します。

MutableCreationExtras のコンストラクタにはマージしたい別の CreationExtras を指定できます。

コード例で CreationExtras 作成時に指定してる defaultViewModelCreationExtras はデフォルトで様々な値が設定されています。これを含めるために MutableCreationExtras のコンストラクタに渡しています。 defaultViewModelCreationExtras はまた後述します。

ViewModelProvider.Factory

ViewModelProvider.Factory は新しく CreationExtras を受け取る create メソッドが追加されいます。これを使って渡された値を取得できますので、それを使ってViewModelを作成します。

以下のような共通のFactoryを作成することも可能です。

viewModels関数

最後に viewModels 関数を使って実際にViewModelを作成します。 extrasProducerfactoryProducer にそれぞれ CreationExtrasViewModelProvider.Factory を渡します。

ここまで一通りの実装になります。

以下、色々な補足情報です。

defaultViewModelCreationExtrasについて

ComponentActivityFragment では HasDefaultViewModelProviderFactory を実装していて、そこに getDefaultViewModelCreationExtras メソッドがあります。

例えば、 ComponentActivity では以下のような実装になっていて、デフォルトで Application や、IntentFragment では arguments )が取得できるようになっています。

これらの値を使ってViewModelを生成することも可能です。

例えばActivityに渡された Intent の引数を受け取るには以下のようになります。

defaultViewModelCreationExtras は結構重要で MutableCreationExtras を使って新しく CreationExtras を生成する場合は必ず defaultViewModelCreationExtras をコンストラクタに渡すようにしてください。

AndroidViewModelとSavedStateHandle

AndroidViewModelSavedStateHandle を扱うには以下のように行います。

ViewModelProvider.Factory で以下のようにして ApplicationSavedStateHandle 取得してViewModelのコンストラクタに渡す感じです。

Composeから扱う場合

Composeで CreationExtras を扱うにはが以下のような感じになります。

デフォルトの CreationExtrasLocalViewModeltoreOwner.current から取得する感じになります。

参考

https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.0-alpha01

--

--

Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO