android 具有自定义视图的MVVM体系结构

ogsagwnx  于 2023-03-16  发布在  Android
关注(0)|答案(3)|浏览(159)

我想在android中使用MVVM架构制作一个自定义视图。首先,我想问,ViewModel是否可以完美地与自定义视图一起工作,就像它在Activity或片段的情况下工作一样?我们可以在自定义视图中从ViewModel提供程序获得ViewModel吗?
如果我需要做一个单独的自定义视图,正确的方法是什么?

bvhaajcl

bvhaajcl1#

一个更好的替代方案是使用新的API view.findViewTreeViewModelStoreOwner(),它为您提供viewModelStoreOwner(如果视图附加到fragment o/w活动,则为Fragment)
您可以创建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相比,视图的生命周期可能较短,因此您可能必须使用基于onAttachedToWindowonDetachedFromWindow回调的LifecycleRegistry来创建自定义视图生命周期(以便正确管理LiveData订阅

eh57zj3b

eh57zj3b2#

**问:**我们可以从ViewModel提供者的自定义视图中获取ViewModel吗?
**回答:**简单的回答是:是的,您可以!

但是如何实现?(进一步说明)ViewModelProviders要求context作为ActivityFragment。因此,您可以使用getContext()从 *CustomView类 * 检索context,在您使用它的地方,它将是Activity/Fragment
将该context强制转换为以下任一类型,并将其提供给ViewModelProvidersViewModelProviders将为您提供该Activity/Fragment容器的对象。
因此,像这样使用,您可以在CustomViewActivity/Fragment之间共享ViewModel。

  • 旁注:您还可以让您的CustomView实现**LifeCycleObserver,通过这种方式,您还可以让您的视图尊重Activity/Fragment生命周期**,以进行初始化/销毁。*
pieyvz9o

pieyvz9o3#

CustomView: ViewModelStoreOwner{

  private var viewModel: YourViewModel

  override fun getViewModelStore() = ViewModelStore() 

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

}

就是这样:)

相关问题