我尝试阅读this,但我想找不到解决方法。
说我有FragmentA和FragmentB。我使用此代码移到片段B
val nextDestination = AFragmentDirections.actionToB()
findNavController().navigate(nextDestination)
当我从片段B返回片段A时,我的片段中的onDestroy
被调用,然后我的ViewModel上的onCleared
也被调用。
但是当我旋转电话(配置更改)时,当调用onDestroy
时,则不会调用onCleared
。
所以我以前假设,当调用onDestroy
时,也会调用onCleared
。但事实并非如此。为什么会有这样的不同行为?当配置更改与片段导航不同时?
我确切地称呼onCleared
时感到困惑
ViewModel的全部要点是要按照ViewModel documentation保留配置更改,因此,期望不会在配置更改后清除ViewModel。
但是,每个ViewModel都与一个ViewModelStoreOwner
相关联。这可能是您的活动,也可能是片段。由ViewModelStoreOwner
决定何时由于临时更改(例如配置更改)或永久性销毁而将其销毁。仅在该永久销毁中才为每个ViewModel调用ViewModelStoreOwner
。
对于活动,当活动结束时(即调用onCleared()
或finish()
的行为导致调用onBackPressed()
时,会发生永久破坏)。
对于片段,发生永久破坏当片段从后堆栈弹出时。这是当您将片段B从后堆栈弹出并返回片段A时发生的-片段B从FragmentManager中删除,它将通过finish()
,并清除其ViewModels。
片段A将会发生相同的事情。