我有一个Activity应用程序。在应用程序的一个部分中,有一个主要细节的碎片组合,使用a shared ViewModel在它们之间共享一些数据。我面临的问题是,即使两个片段都被销毁,ViewModel的onCleared()方法也不会被调用。 onCleared()仅在活动被销毁时被调用。
这是它应该如何工作?因为在单个Activity模型中这是无用的,因为Activity始终处于活动状态。或者我错过了什么?
如果不看一点代码,那么给出一个可靠的答案会有点困难。我的第一个猜测是你可能将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
从未在技术上被破坏,因为它是让你的应用程序保持前景的原因。
如果这不是解决问题的正确方法,那么我认为ViewModel
上的文档可能是开始寻找正确答案的好地方。快乐的编码!
如果您在ViewModelProviders.of(this)
中传递该活动,那么,是的,这是预期的行为。要使ViewModel仅限定为主片段和细节片段,您可能需要为它们创建父片段,例如,MasterDetailFragment
,它同时包含MasterFragment
和DetailsFragment
。