弹出片段时 SharedViewModel 不清除
SharedViewModel not clearing when poping fragment
我正在使用像 here
这样的共享视图模型
但问题是,当我清除我的最后一个片段时,我想清除视图模型,或者杀死它的实例,但是当我离开使用它的最后一个片段时,它以某种方式存活了下来
如何以编程方式清除此视图模型?
我是这样用的
片段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
}
但是当使用该数据离开 Fragment A 时(执行 popBackStack 因为我使用的是导航组件)它不会清除视图模型,而是当我再次打开我的 fragment 时,数据仍然存在
我怀疑视图模型与我的容器有关 Activity 而不是片段本身的生命周期,所以
当我点击最后一个片段时,如何删除实例或清除我的 viewmdel?
谢谢
如果你想获得与父片段关联的 ViewModel,你的内部片段应遵循 by viewModels
JavaDoc 并使用:
val viewmodel: MYViewModel by viewmodels ({requireParentFragment()})
这表示使用父 Fragment 作为您的 ViewModel 的所有者。
(父片段将使用 by viewModels()
,因为它正在访问自己的 ViewModel)
你也可以在Fragment A销毁后手动清空viewModelStore。
像这样:
override fun onDetach() {
super.onDetach()
requireActivity().viewModelStore.clear()
}
然后您的 viewModel 实例将被清除。为了检查这项工作,您可以调试 viewModel 的 onCleared
方法。
我正在使用像 here
这样的共享视图模型但问题是,当我清除我的最后一个片段时,我想清除视图模型,或者杀死它的实例,但是当我离开使用它的最后一个片段时,它以某种方式存活了下来
如何以编程方式清除此视图模型?
我是这样用的
片段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
}
但是当使用该数据离开 Fragment A 时(执行 popBackStack 因为我使用的是导航组件)它不会清除视图模型,而是当我再次打开我的 fragment 时,数据仍然存在
我怀疑视图模型与我的容器有关 Activity 而不是片段本身的生命周期,所以
当我点击最后一个片段时,如何删除实例或清除我的 viewmdel?
谢谢
如果你想获得与父片段关联的 ViewModel,你的内部片段应遵循 by viewModels
JavaDoc 并使用:
val viewmodel: MYViewModel by viewmodels ({requireParentFragment()})
这表示使用父 Fragment 作为您的 ViewModel 的所有者。
(父片段将使用 by viewModels()
,因为它正在访问自己的 ViewModel)
你也可以在Fragment A销毁后手动清空viewModelStore。 像这样:
override fun onDetach() {
super.onDetach()
requireActivity().viewModelStore.clear()
}
然后您的 viewModel 实例将被清除。为了检查这项工作,您可以调试 viewModel 的 onCleared
方法。