【问题标题】:How to have separate instance of ViewModel in each Fragment and have shared data as well between Viewmodels如何在每个 Fragment 中拥有单独的 ViewModel 实例并在 Viewmodel 之间共享数据
【发布时间】:2019-03-02 14:37:12
【问题描述】:

我正在开发 Android TV 应用 我有一个片段(主片段),内部片段有侧菜单,每个菜单项都会创建新的片段(菜单片段)。 我有 Viewmodel,在 ViewModel 中有配置 livedata,我在创建主 Fragment 时正在加载这些数据。 Menu Fragment 的数据基于我从 API 调用和配置数据中获得的数据

我已经创建了具有活动生命周期的视图模型的单个实例。 但问题是,当我从一个片段导航到另一个片段时,例如从 1-2 个片段,并且由于 1 个片段已经加载数据,livedata 不是空的,并且在获取它观察/显示的第二个片段数据之前导航到第二个片段 livedata从第一个片段,然后在它获取数据后它是自己的 我认为每个片段都应该有它自己的实例,但我还需要在 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))
    }
  })

【问题讨论】:

  • 不要观察 Activity 生命周期。尝试观察片段生命周期。这样每次创建片段时,您都会获得新的数据。
  • 是的,但在这种情况下,如何在 viewModel 之间共享数据?
  • 我建议你拿两个ViewModels,一个是每个片段实例(即HomeViewModel),另一个是共享ViewModel (即SharedViewModel ).
  • 是的,在这种情况下,ViewModel 中访问 SharedViewMdoel 数据的最佳方式是什么?

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


【解决方案1】:

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

我认为通常这是您使用 DI 管理的事情(将相同的配置注入两个 ViewModel)

或者每个 Fragment 都需要将 Activity ViewModel 的数据传递给 Fragment 的 ViewModel。或者你可以有一个全局的 LiveData 来管理自己(在 onActive() 中加载数据)并完全跳过活动 ViewModel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2019-07-02
    • 1970-01-01
    • 2021-06-27
    相关资源
    最近更新 更多