【问题标题】:MVVM architecture with custom view具有自定义视图的 MVVM 架构
【发布时间】:2020-01-07 11:00:51
【问题描述】:

我想在 android 中使用 MVVM 架构制作自定义视图。首先,我想问一下,ViewModel 是否可以完美地与自定义视图一起工作,因为它可以在活动或片段的情况下工作?我们可以在自定义视图中从 ViewModel 提供者获取 ViewModel 吗?

如果我需要制作单独的自定义视图,正确的方法是什么?

【问题讨论】:

标签: android android-architecture-components android-sdk-2.1


【解决方案1】:

问:我们能否在自定义视图中从 ViewModel 提供者那里获得ViewModel

回答:简单的答案是可以!

但是如何? (进一步解释) ViewModelProviders 需要 context 作为ActivityFragment。因此,您可以使用getContext() 从您的CustomView 类 中检索context,这将是您使用它的Activity/Fragment

context 转换为任一类型并将其提供给ViewModelProviders,这将为您提供该Activity/Fragment 容器的对象。

因此像这样使用,您可以在 CustomViewActivity/Fragment 之间共享 ViewModel。


旁注:你也可以让你的CustomView实现LifeCycleObserver,这样你也可以让你的视图尊重@987654335的生命周期 @ 用于初始化/销毁的东西。

【讨论】:

  • ViewModelProviders.of(context) 在最新版本中不再存在。如何使用替换(ViewModelProvider() 需要 LifecycleOwner)来做到这一点?
  • 是的,现在这很棘手。要通过context 使用它,您需要将其转换为LifecycleOwner 以获得ViewModelProvider。在自定义视图中,获取上下文将始终是您要膨胀到的 Activity。
【解决方案2】:

更好的选择是使用新的APIview.findViewTreeViewModelStoreOwner(),它为您提供 viewModelStoreOwner(如果视图附加到片段 o/w 活动,则片段)

您可以创建 ViewModelProvider,然后获取 ViewModel。

以下是 Kotlin 中的代码示例

private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
        ViewModelProvider(viewModelStoreOwner).get(ViewModel::class.java)
}

同样,还有其他类似的 API,例如 view.findViewTreeLifecycleOwner()view.findViewTreeSavedStateRegistryOwner()

这是一种更简洁的方法,因为您不必将 context 类型转换为 ActivityFragment,并且还可以扩展到 ViewModelStoreOwner 的其他实现。

这里需要注意的一点是,与 Activity/Fragment 相比,视图的生命周期可能更短,因此您可能必须基于 @ 使用 LifecycleRegistry 制作自定义视图生命周期(以便正确管理您的 LiveData 订阅) 987654331@ 和 onDetachedFromWindow 回调

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 1970-01-01
    • 2011-11-23
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多