我使用的是像这里这样的共享视图模型
但问题是,当我清除最后一个片段时,我想清除视图模型,或者杀死它的实例,但不知何故,当我留下最后一个使用它的片段时,它仍然存在
如何用程序清除此视图模型?
我像这个一样使用它
片段A
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated() {
model.getTotal().observe(viewLifecycleOwner, Observer { cartTotal ->
total = cartTotal
})
}
从碎片B,我发送了总
片段B
private val model: SharedViewModel by activityViewModels()
override fun onViewCreated() {
model.setTotal = 10
}
但是,当把数据留给片段A时(因为我使用的是导航组件,所以使用popBackStack(,它并没有清除视图模型,相反,当我再次打开片段时,数据仍然存在
我怀疑视图模型与我的容器活动有关,而不是碎片本身的生命周期,所以
当我命中最后一个片段时,如何删除实例或清除我的viewmdel?
感谢
如果您想获得与父片段相关联的ViewModel,您的内部片段应该遵循by viewModels
JavaDoc并使用:
val viewmodel: MYViewModel by viewmodels ({requireParentFragment()})
这表示使用父Fragment作为ViewModel的所有者。
(父片段将使用by viewModels()
,因为它正在访问自己的ViewModels(
您还可以在片段A销毁后手动清除viewModelStore。像这样的东西:
override fun onDetach() {
super.onDetach()
requireActivity().viewModelStore.clear()
}
则您的viewModel实例将被清除。为了检查这项工作,您可以调试viewModel的onCleared
方法。