如何在每个Fragment中拥有单独的ViewModel实例,以及如何在Viewmodel之间共享数据

时间:2019-03-02 14:37:12

标签: android viewmodel android-architecture-components android-livedata

我正在使用Android TV应用 我有一个Fragment(主Fragment),并且在fragment里面有侧面菜单,每个菜单项都会创建一个新的fragment(menu Fragment)。 我有Viewmodel,在ViewModel中,我有配置livedata,当我创建主Fragment时我正在加载。 菜单片段的数据基于我从API调用和配置数据中获得的数据

我已经使用活动生命周期创建了viewmodel的单个实例。 但是问题是当我从一个片段导航到另一个片段(例如从1-2片段)时,由于1个片段已经加载了数据,因此livedata不为空,并且在获取其观察/显示的livedata的第二个片段数据之前导航至第2个片段从第一个片段开始,然后在获取数据后拥有它 我认为每个片段都应该有自己的实例,但是我还需要在viewmodel的每个实例之间共享(配置)的数据? 我该怎么做?

  private val viewModel: HomeViewModel by lazyViewModelActivityScope()
viewModel.fetch()
   viewModel.configData.observe(viewLifecycleOwner, Observer { it ->
  loadData(it)
})

它在MenuFragment内部

  private val viewModel: HomeViewModel by lazyViewModelActivityScope()

 viewModel.fetchMenuPage(menuItem)
      viewModel.carouselsWithAssetsData.observe(viewLifecycleOwner, Observer { carouselWithAssets ->
    carouselWithAssets.forEach { carouselWithAsset ->
      mRowsAdapter.add(createCardRow(carouselWithAsset))
    }
  })

1 个答案:

答案 0 :(得分:0)

我得到了我的问题的答案,并且想与他人分享

我认为通常这是您可以通过DI来管理的(将相同的配置注入到两个ViewModel中)

或者每个Fragment需要将活动ViewModel的数据传递到Fragment的ViewModel。或者,您可以拥有一个可自行管理的全局LiveData(在onActive()中加载数据)并完全跳过活动ViewModel