
フラグメントに対応するViewModelが新たに生成されない
フラグメント(Fragment)を再生成した際に、ViewModelに前のフラグメントの値が残るという変な挙動を観測しました
フラグメントっていうかまあダイアログなんですけど細かいことはさておき
フラグメント内に非同期で取得したデータを表示させたかったので、フラグメントに対してViewModelを設けて、そこに取得したデータを置くみたいな実装をしました
アクティビティからからコードをコピペして貼り付けた為にViewModelProviderの引数が誤ったものになっていました
viewModel = ViewModelProvider(activity, FooViewModel.Factory(credential))
.get(FooViewModel::class.java)
正しくはこう
viewModel = ViewModelProvider(this@FooFragment, FooViewModel.Factory(credential))
.get(FooViewModel::class.java)
フラグメントに対応するViewModelなので、引数のownerにはフラグメント自身を渡すのが正解
細かいことを調べなくても雰囲気で間違ってるな~と気づくとは思いますが、一応 公式ドキュメントを見ると、
ViewModel
は、スコープに設定されているViewModelStoreOwner
が消えるまでメモリ内にとどまります。
とまあ、答えが書いてありますね・・・
ViewModelProviderの引数にアクティビティを指定したせいで、フラグメントが破棄されてもViewModelは残り続けてしまい、最初に述べたような挙動になってしまった、という訳です
反省・・・