具有自定义视图的 MVVM 架构

Vin*_*ena 4 android android-sdk-2.1 android-architecture-components

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

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

Atu*_*pta 14

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

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

下面是 Kotlin 中的代码示例

private val viewModel by lazy(LazyThreadSafetyMode.NONE) {
        ViewModelProvider(viewModelStoreOwner).get(ViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

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

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

这里需要注意的一件事是,与 Activity/Fragment 相比,视图的生命周期可能较短,因此您可能必须使用LifecycleRegistry基于onAttachedToWindowonDetachedFromWindow回调来创建自定义视图生命周期(以便正确管理您的 LiveData 订阅)

  • 请注意,这些方法仅在`onAttachToWindow()`之后可用。 (3认同)

Jee*_*ede 5

问:我们可以ViewModel在自定义视图中从 ViewModel 提供者获取吗?

答:简单的答案是可以!

但是如何?(进一步解释) ViewModelProviders需要上下文ActivityFragment。所以,你可以检索contextCustomView类使用getContext()这将是Activity/Fragment你在哪里使用它。

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

因此,像这样使用,您可以在您的CustomViewActivity/Fragment.


边注:您也可以让你CustomView实现LifeCycleObserver,在这种方式,你也可以让你的看法尊重生命周期Activity/Fragment初始化/销毁的东西。