繁体   English   中英

当我使用导航组件关闭片段时,为什么会调用我的 viewModel 中的 onCleared?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM