Googleの公式ドキュメントでは、activityViewModels
を使ってFragment間でViewModelを共有する方法が紹介されています。しかし、どうにかviewModels
だけで済ませられないかと思い、親子関係のあるFragment間であれば実現できそうなので紹介します。
実装
早速見ていきましょう。ここでは子のDialogFragmentを親のFragmentで生成して呼び出す場合を想定しています。
親Fragment
ViewModelの生成にはviewModels
を使います。子Fragmentを生成する際にはchildFragmentManager
を渡してあげます。
ParentFragment.kt
class ParentFragment : Fragment() {
val shareViewModel by viewModels<SampleShareViewModel>()
private fun showDialog() {
ChildDialogFragment().show(childFragmentManager, "Tag")
}
}
子Fragment
こちらもviewModels
を用いてViewModelを生成します。子Fragmentでは、viewModels
の引数ownerProducer
に「requireParentFragment()
を返す関数」を指定することがポイントになります。
ChildDialogFragment.kt
class ChildDialogFragment : DialogFragment() {
val shareViewModel by viewModels<SampleShareViewModel>(
// 今回のポイントとなる部分
ownerProducer = {
requireParentFragment()
}
)
}
利用例
- DialogFragment
- ViewPager
- その他いろいろ
終わりに
コメントや質問指摘など随時歓迎しています。