[英]why onCleared in my viewModel is called when I close the fragment using navigation component?
我试图阅读this ,但我想我找不到解决方案。
说我有 FragmentA 和 Fragment B。我使用此代码移动到片段 B
val nextDestination = AFragmentDirections.actionToB()
findNavController().navigate(nextDestination)
当我从片段 B 返回到片段 A 时,我的片段中的onDestroy
被调用,然后我的 ViewModel 上的onCleared
也被调用。
但是当我旋转手机(配置更改)时,当调用onDestroy
时,不会调用onCleared
。
所以我之前假设,当调用onDestroy
,也会调用onCleared
。 但事实并非如此。 为什么会有这样的不同行为? 当配置更改与片段导航不同时?
当确切地调用onCleared
时,我很困惑
ViewModel 的全部意义在于根据ViewModel 文档在配置更改后幸存下来,因此预计 ViewModel 不会因配置更改而被清除。
但是,每个 ViewModel 都与一个ViewModelStoreOwner
相关联。 这可能是您的活动,也可能是片段。 由ViewModelStoreOwner
来了解它何时因临时更改(例如配置更改)或永久销毁而被销毁。 只有在永久销毁中, onCleared()
调用每个 ViewModel 的onCleared()
。
对于一个活动,当活动结束后是永久的破坏情况(即finish()
被调用或行为onBackPressed()
导致finish()
被调用)。
对于 Fragment,当 Fragment 从后堆栈弹出时,就会发生永久性破坏。 这就是当您从返回堆栈中弹出片段 B 并返回到片段 A 时会发生的情况 - 片段 B 从 FragmentManager 中删除,它通过onDestroy()
,并且它的 ViewModel 被清除。
片段A将有同样的事情发生在它一旦被弹出返回堆叠或者,如果是回堆栈上的唯一的事情,当,当你点击系统恢复按钮活动结束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.