InitializerViewModelFactoryを使ってViewModelを生成

Kenji Abe
Feb 26, 2022

--

Photo by Possessed Photography on Unsplash

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

AndroidViewModelSavedStateHandle に対応するには 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

--

--

Kenji Abe
Kenji Abe

Written by Kenji Abe

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

No responses yet