具有自定义视图的MVVM架构

问题描述 投票:0回答:3

我想在android中使用MVVM架构制作一个自定义视图。首先,我想问,ViewModel 是否可以与自定义视图完美配合,就像在活动或片段的情况下一样?我们可以在自定义视图中从 ViewModel 提供程序获取 ViewModel 吗?

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

android android-architecture-components android-sdk-2.1
3个回答
13
投票

更好的选择是使用新的 API

view.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
转换为
Activity
Fragment
,并且也可以扩展到
ViewModelStoreOwner
的其他实现。

这里需要注意的一件事是,与 Activity/Fragment 相比,视图的生命周期可能更短,因此您可能必须使用基于

LifecycleRegistry
onAttachedToWindow
来创建自定义视图生命周期(以便正确管理您的 LiveData 订阅)和
onDetachedFromWindow
回调


7
投票

问: 我们可以在自定义视图中从 ViewModel 提供程序获取

ViewModel
吗?

答: 简单的答案是可以!

但是如何呢? (进一步说明)

ViewModelProviders
需要 context 作为
Activity
Fragment
。因此,您可以使用
context
从您的 CustomView 类 检索
getContext()
,这将是您正在使用它的
Activity/Fragment

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

因此,像这样使用,您可以在

CustomView
Activity/Fragment
之间共享ViewModel。


旁注:您还可以让您的

CustomView
实现
LifeCycleObserver
,这样您也可以使您的视图尊重 Activity/Fragment
lifecycle
进行初始化/销毁。


-1
投票
CustomView: ViewModelStoreOwner{

  private var viewModel: YourViewModel

  override fun getViewModelStore() = ViewModelStore() 

  init{
    viewModel = ViewModelProvider(this)[YourViewModel::class.java]
  }

}

总之,此代码在实现 ViewModelStoreOwner 接口的 Android 应用中定义了一个自定义视图 (CustomView)。它使用 ViewModelProvider 创建和管理 YourViewModel 实例,确保 ViewModel 在配置更改后仍然存在并与 CustomView 的生命周期相关联。 getViewModelStore() 函数提供了一个 ViewModelStore 来管理 ViewModel 实例。这种模式常用于 Android 应用程序开发中,用于分离和管理 UI 相关的数据和逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.