Lifecycle ViewModel 2.5.0-alpha03 で InitializerViewModelFactory
が追加されています。この InitializerViewModelFactory
を使ってViewModelを生成する方法を紹介します。
ここでは CreationsExtras
についても出てくるので、前回書いた記事を参考にしてください。
InitializerViewModelFactory
を使うとシンプルにViewModelFactoryを生成することができるようになっています。
※これを書いてる時点では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
簡単な使用例
例としてコンストラクタ引数を一つ持ったViewModelを生成してみます。Activityから生成することを想定します。
InitializerViewModelFactory
は直接使用することはできないため、 InitializerViewModelFactoryBuilder
を使って InitializerViewModelFactory
を作成します。
addInitializer
の中で単純にViewModelのインスタンスを作っています。このとき引数も渡しています。
あとはこのFactoryを ViewModelProvider
を使ってViewModelを取得するだけです。
全体的なコードは以下のような感じになります。
viewModelFactory関数
viewModelFactory
という関数が用意されてるので、そちらを使うともう少し簡単にFactoryを作れます。
このFactoryは複数のViewModelにも対応できます。
今回の例ではActivity内でFactoryを作成していますが、グローバルに定義して複数の箇所から使用することも可能です。
AndroidViewModelとSavedStateHandle
AndroidViewModel
や SavedStateHandle
に対応するには CreationExtras
を使って対応します。
initializer
のスコープは CreationExtras
になっているので this
でアクセスできるので、そこから渡された値を取得できるようになっています。
CreationExtrasを使って値を渡す
CreationExtras
を使って独自の値を渡すことも可能になっています。
前回の記事でも書きましたが、 CreationExtras
を作る際は Activity/Fragmentの defaultViewModelCreationExtras
を含めることを忘れないようにしましょう。
Composeから扱う場合
Composeの場合は新しく initializer
を受け取れる viewModel
関数が追加されていますので、そちらを使うだけです。
参考
https://developer.android.com/jetpack/androidx/releases/lifecycle#2.5.0-alpha03