【发布时间】: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