清除 sharedViewModel
Posted
技术标签:
【中文标题】清除 sharedViewModel【英文标题】:Clearing sharedViewModel 【发布时间】:2019-11-19 16:52:48 【问题描述】:我正在使用 Koin 将 viewModel 注入片段。我的应用程序是单一活动。我只需要在 servisFragment 和 partFragment 中使用 sharedViewModel。 我想在标记为红色的导航后从 Activity 中清除该 viewModel。
我该怎么做?
viewModel注入代码
private val servisViewModel by sharedViewModel<ServisViewModel>()
Koin sharedViewModel
inline fun <reified T : ViewModel> Fragment.sharedViewModel(
name: String? = null,
noinline from: ViewModelStoreOwnerDefinition = activity as
ViewModelStoreOwner ,
noinline parameters: ParametersDefinition? = null
) = lazy getSharedViewModel<T>(name, from, parameters)
感谢您的帮助。
【问题讨论】:
在传统的嵌套Fragment中,我们可以使用by sharedViewModel(from = parentFragment as ViewModelStoreOwner)
将ViewModel生命周期绑定到父Fragment生命周期。但是在导航组件中,我不知道如何获取父片段实例。
我设法绑定了 Koin 和上面的代码,但我不知道如何清除/取消绑定它以及是否需要这样做。
你不需要清除,就像by viewModel()
可以在fragment销毁时自动清除。
为 sharedViewModel 添加了代码。当片段被销毁时它是否会被清除,即使它像上面的代码一样使用 ViewModelStoreOwner 作为活动?
你使用导航组件吗?如果为真,则无法通过调用getParentFragment()
获取父片段。它总是返回 NavHostFragment
而不是你的 servisFragment
。
【参考方案1】:
如果您需要从该Fragment
中清除所有viewModels
,请在您的Fragment
中尝试此操作
viewModelStore.clear()
如果你需要清除混凝土ViewModel
试试这个
getViewModelStore(ViewModelParameters(...)).clear()
【讨论】:
getViewModelStore 不接受参数?【参考方案2】:如果你使用koin注入,在你应该使用的fragment的onDestoy
中
requireActivity().viewModelStore.clear()
因为 viewModelStore 直接从 Fragment 将返回 none 以清除
但是这样做的问题是它会清除ALL这个 ViewModelStore 范围内的视图模型。因此,您将无法控制要清除的 ViewModel。
【讨论】:
以上是关于清除 sharedViewModel的主要内容,如果未能解决你的问题,请参考以下文章