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

问题描述 投票:0回答:1

我尝试阅读this,但我想找不到解决方法。

说我有FragmentA和FragmentB。我使用此代码移到片段B

val nextDestination = AFragmentDirections.actionToB()
findNavController().navigate(nextDestination)

当我从片段B返回片段A时,我的片段中的onDestroy被调用,然后我的ViewModel上的onCleared也被调用。

但是当我旋转电话(配置更改)时,当调用onDestroy时,则不会调用onCleared

所以我以前假设,当调用onDestroy时,也会调用onCleared。但事实并非如此。为什么会有这样的不同行为?当配置更改与片段导航不同时?

我确切地称呼onCleared时感到困惑

android android-architecture-components android-viewmodel android-architecture-navigation android-jetpack-navigation
1个回答
0
投票

ViewModel的全部要点是要按照ViewModel documentation保留配置更改,因此,期望不会在配置更改后清除ViewModel。

但是,每个ViewModel都与一个ViewModelStoreOwner相关联。这可能是您的活动,也可能是片段。由ViewModelStoreOwner决定何时由于临时更改(例如配置更改)或永久性销毁而将其销毁。仅在该永久销毁中才为每个ViewModel调用ViewModelStoreOwner

对于活动,当活动结束时(即调用onCleared()finish()的行为导致调用onBackPressed()时,会发生永久破坏)。

对于片段,发生永久破坏当片段从后堆栈弹出时。这是当您将片段B从后堆栈弹出并返回片段A时发生的-片段B从FragmentManager中删除,它将通过finish(),并清除其ViewModels。

一旦将[[it从后堆栈中弹出,或者如果(如果它是后堆栈中的唯一东西),当您按下系统后退按钮完成活动时,

片段A将会发生相同的事情。

© www.soinside.com 2019 - 2024. All rights reserved.