清除 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的主要内容,如果未能解决你的问题,请参考以下文章

清除浮动-清除清除固定

清除emmc怎么恢复

如何将历史记录彻底清除掉

关于清除浮动的方法

求助高手:怎么清除NETBIOS的缓存

HTML要怎么清除浮动