弹出片段时SharedViewModel未清除



我使用的是像这里这样的共享视图模型

但问题是,当我清除最后一个片段时,我想清除视图模型,或者杀死它的实例,但不知何故,当我留下最后一个使用它的片段时,它仍然存在

如何用程序清除此视图模型?

我像这个一样使用它

片段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 viewModelsJavaDoc并使用:

val viewmodel: MYViewModel by viewmodels ({requireParentFragment()})

这表示使用父Fragment作为ViewModel的所有者。

(父片段将使用by viewModels(),因为它正在访问自己的ViewModels(

您还可以在片段A销毁后手动清除viewModelStore。像这样的东西:

override fun onDetach() {
super.onDetach()
requireActivity().viewModelStore.clear()
}

则您的viewModel实例将被清除。为了检查这项工作,您可以调试viewModel的onCleared方法。

相关内容

  • 没有找到相关文章

最新更新