ViewModel 架构更新:告别 ViewModelProviders,拥抱 ViewModelProvider
2024-03-28 09:51:05
在 Android 中使用最新 ViewModel 架构
引言
在 Android 开发中,ViewModel 已成为管理 UI 状态和逻辑的重要工具。在较早版本的 Android 架构组件中,我们使用 ViewModelProviders
来获取 ViewModel 实例。然而,在 1.1.0 版本中,ViewModelProviders
已被弃用,这给开发人员带来了新的挑战。
问题:ViewModelProviders
已弃用
ViewModelProviders
已在 API 级别 1.1.0 中弃用。当我们使用最新依赖项 android.arch.lifecycle:extensions:1.1.1
时,我们无法再使用 ViewModelProviders
来获取 ViewModel 实例。
解决方案:使用 ViewModelProvider
为了解决这个问题,我们需要使用 ViewModelProvider
代替 ViewModelProviders
。ViewModelProvider
具有与 ViewModelProviders
类似的功能,但它使用不同的方法来获取 ViewModel 实例。
使用 ViewModelProvider.AndroidViewModelFactory
ViewModelProvider
使用 ViewModelProvider.Factory
来创建 ViewModel 实例。对于在 Android 应用程序中使用的 ViewModel,我们可以使用 ViewModelProvider.AndroidViewModelFactory
。
要获取 ViewModel
实例,我们需要使用以下代码:
val model = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MyViewModel::class.java)
注意: 与 ViewModelProviders
不同,ViewModelProvider
不提供 of
方法。我们需要在 ViewModelProvider
构造函数中指定 ViewModelStoreOwner
和 ViewModelProvider.Factory
。
常见问题解答
1. 为什么 ViewModelProviders
已被弃用?
ViewModelProviders
已被弃用,因为它与 Jetpack 中的 ViewModelStore
机制不兼容。ViewModelStore
允许更细粒度地控制 ViewModel 实例的生命周期,从而提高了应用程序的性能和稳定性。
2. ViewModelProvider
与 ViewModelProviders
有何不同?
ViewModelProvider
与 ViewModelProviders
的主要区别在于,ViewModelProvider
使用 ViewModelStoreOwner
和 ViewModelProvider.Factory
来创建 ViewModel 实例。这提供了更灵活、更可定制的机制。
3. ViewModelProvider.AndroidViewModelFactory
是什么?
ViewModelProvider.AndroidViewModelFactory
是一个 ViewModelProvider.Factory
实现,它适用于在 Android 应用程序中使用的 ViewModel。它使用应用程序的 Application
上下文来创建 ViewModel 实例。
4. 如何使用 ViewModelProvider
创建 ViewModel 实例?
要使用 ViewModelProvider
创建 ViewModel 实例,我们需要指定 ViewModelStoreOwner
和 ViewModelProvider.Factory
。对于在 Android 应用程序中使用的 ViewModel,我们可以使用以下代码:
val model = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MyViewModel::class.java)
5. ViewModelStoreOwner
是什么?
ViewModelStoreOwner
是一个接口,用于表示拥有 ViewModelStore
的对象。ViewModelStore
是一个容器,其中存储了与特定 ViewModelStoreOwner
关联的 ViewModel 实例。