はじめに
前提として、deprecatedになっているViewModelProviders.ofやfragment-ktxを導入せずにViewModelを使ってデータ共有したいと思い調べた。
手順
- 引数なしのViewModel
- AndroidViewModel(application)を継承していて引数がapplicationだけのとき
であればViewModelProviderを使用した以下のコードでとても簡単に共有することができる。
MainActivity.kt
//FirstFragmentとSecondFragmentと共有
private val viewModel by lazy {
ViewModelProvider(this)[MainViewModel::class.java]
}
FirstFragment.kt
//SecondFragmentとMainActivityと共有
private val parentViewModel by lazy {
ViewModelProvider(requireActivity())[MainViewModel::class.java]
}
SecondFragment.kt
//FirstFragmentとMainActivityと共有
private val parentViewModel by lazy {
ViewModelProvider(requireActivity())[MainViewModel::class.java]
}
activityのthisとfargmentのrequireActivity()で、ViewModelProviderに渡すViewModelStoreOwnerが同じであれば、共有することができる。
引数のあるViewModelであればandroidx.lifecycle:lifecycle-*:2.5.0にて追加されているInitializerViewModelFactory
を使ってviewModelfactoryを作るのが楽そう。
参考
javaの方を参考にしました。
できるならfragment-ktx導入したほうが良さそうですね。とても簡潔〜