LoginSignup
3
3

More than 1 year has passed since last update.

ActivityとFragment間でViewModelを共有したい

Last updated at Posted at 2022-09-16

はじめに

前提として、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導入したほうが良さそうですね。とても簡潔〜

3
3
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
3
3