Lifecycle ViewModel 2.5.0-alpha01 に CreationExtras
が追加されました。この CreationExtras
について使い方などを紹介したいと思います。
CreationExtras
は ViewModelProvider.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.Key
は CreationExtras
で使用する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を作成します。 extrasProducer
と factoryProducer
にそれぞれ CreationExtras
と ViewModelProvider.Factory
を渡します。
ここまで一通りの実装になります。
以下、色々な補足情報です。
defaultViewModelCreationExtrasについて
ComponentActivity
と Fragment
では HasDefaultViewModelProviderFactory
を実装していて、そこに getDefaultViewModelCreationExtras
メソッドがあります。
例えば、 ComponentActivity
では以下のような実装になっていて、デフォルトで Application
や、Intent
( Fragment
では arguments
)が取得できるようになっています。
これらの値を使ってViewModelを生成することも可能です。
例えばActivityに渡された Intent の引数を受け取るには以下のようになります。
defaultViewModelCreationExtras
は結構重要で MutableCreationExtras
を使って新しく CreationExtras
を生成する場合は必ず defaultViewModelCreationExtras
をコンストラクタに渡すようにしてください。
AndroidViewModelとSavedStateHandle
AndroidViewModel
と SavedStateHandle
を扱うには以下のように行います。
ViewModelProvider.Factory
で以下のようにして Application
と SavedStateHandle
取得してViewModelのコンストラクタに渡す感じです。
Composeから扱う場合
Composeで CreationExtras
を扱うにはが以下のような感じになります。
デフォルトの CreationExtras
は LocalViewModeltoreOwner.current
から取得する感じになります。
参考
https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.0-alpha01