永远不会调用共享ViewModel的onCleared()

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

我有一个Activity应用程序。在应用程序的一个部分中,有一个主要细节的碎片组合,使用a shared ViewModel在它们之间共享一些数据。我面临的问题是,即使两个片段都被销毁,ViewModel的onCleared()方法也不会被调用。 onCleared()仅在活动被销毁时被调用。

这是它应该如何工作?因为在单个Activity模型中这是无用的,因为Activity始终处于活动状态。或者我错过了什么?

android android-fragments viewmodel
2个回答
2
投票

如果不看一点代码,那么给出一个可靠的答案会有点困难。我的第一个猜测是你可能将ViewModel限制在你的Activity而不是Fragment本身。

//inside of fragment onCreate()

//scoped to fragment
viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)

//scoped to activity
viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class.java)

如果是这种情况,如果你看一下ViewModel范围的图表。然后onCleared()永远不会被调用的原因是因为你的Activity从未在技术上被破坏,因为它是让你的应用程序保持前景的原因。

enter image description here

如果这不是解决问题的正确方法,那么我认为ViewModel上的文档可能是开始寻找正确答案的好地方。快乐的编码!


1
投票

如果您在ViewModelProviders.of(this)中传递该活动,那么,是的,这是预期的行为。要使ViewModel仅限定为主片段和细节片段,您可能需要为它们创建父片段,例如,MasterDetailFragment,它同时包含MasterFragmentDetailsFragment

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