0
0

More than 1 year has passed since last update.

親子関係のあるFragment間でactivityViewModelsを使わずにviewModelsを使ってViewModelを共有する

Last updated at Posted at 2022-09-18

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
  • その他いろいろ

終わりに

コメントや質問指摘など随時歓迎しています。

参考にしたサイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0