具有自定义视图的 MVVM 架构
MVVM architecture with custom view
我想在 android 中使用 MVVM 架构制作自定义视图。首先,我想问一下,ViewModel 是否可以像在 activity 或片段的情况下一样与自定义视图完美配合?我们可以在自定义视图中从 ViewModel 提供程序获取 ViewModel 吗?
如果我需要制作单独的自定义视图,正确的做法是什么?
问: 我们可以在自定义视图中从 ViewModel 提供程序获取 ViewModel
吗?
答案:简单的回答是可以!
但是怎么办? (进一步说明) ViewModelProviders
需要 context 作为 Activity
或 Fragment
。因此,您可以使用 getContext()
从 CustomView class 检索 context
,这将是 Activity/Fragment
您正在使用它的地方。
将 context
转换为任一类型并将其提供给 ViewModelProviders
,这将为您提供该 Activity/Fragment
容器的对象。
因此这样使用,您可以在 CustomView
和 Activity/Fragment
之间共享 ViewModel。
旁注:你也可以让你的CustomView
实现LifeCycleObserver
,这样你也可以让你的观点得到尊重生命周期 Activity/Fragment
用于 initialization/destruction 东西。
更好的选择是使用新的 API view.findViewTreeViewModelStoreOwner()
,它为您提供 viewModelStoreOwner(Fragment if view is attached to the fragment o/w activity)
您可以创建 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 相比,视图的生命周期可能更短,因此您可能必须使用 [= 创建自定义视图生命周期(以便正确管理您的 LiveData 订阅) 18=] 基于 onAttachedToWindow
和 onDetachedFromWindow
回调
我想在 android 中使用 MVVM 架构制作自定义视图。首先,我想问一下,ViewModel 是否可以像在 activity 或片段的情况下一样与自定义视图完美配合?我们可以在自定义视图中从 ViewModel 提供程序获取 ViewModel 吗?
如果我需要制作单独的自定义视图,正确的做法是什么?
问: 我们可以在自定义视图中从 ViewModel 提供程序获取 ViewModel
吗?
答案:简单的回答是可以!
但是怎么办? (进一步说明) ViewModelProviders
需要 context 作为 Activity
或 Fragment
。因此,您可以使用 getContext()
从 CustomView class 检索 context
,这将是 Activity/Fragment
您正在使用它的地方。
将 context
转换为任一类型并将其提供给 ViewModelProviders
,这将为您提供该 Activity/Fragment
容器的对象。
因此这样使用,您可以在 CustomView
和 Activity/Fragment
之间共享 ViewModel。
旁注:你也可以让你的CustomView
实现LifeCycleObserver
,这样你也可以让你的观点得到尊重生命周期 Activity/Fragment
用于 initialization/destruction 东西。
更好的选择是使用新的 API view.findViewTreeViewModelStoreOwner()
,它为您提供 viewModelStoreOwner(Fragment if view is attached to the fragment o/w activity)
您可以创建 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 相比,视图的生命周期可能更短,因此您可能必须使用 [= 创建自定义视图生命周期(以便正确管理您的 LiveData 订阅) 18=] 基于 onAttachedToWindow
和 onDetachedFromWindow
回调