Razl-Dazl

eyecatch

フラグメントに対応するViewModelが新たに生成されない

Posted at — 2023-03-14

フラグメント(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は残り続けてしまい、最初に述べたような挙動になってしまった、という訳です

反省・・・

Author@zakuro

Mastodon: 396@vivaldi.net