返回

ViewModel 架构更新:告别 ViewModelProviders,拥抱 ViewModelProvider

Android

在 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 代替 ViewModelProvidersViewModelProvider 具有与 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 构造函数中指定 ViewModelStoreOwnerViewModelProvider.Factory

常见问题解答

1. 为什么 ViewModelProviders 已被弃用?

ViewModelProviders 已被弃用,因为它与 Jetpack 中的 ViewModelStore 机制不兼容。ViewModelStore 允许更细粒度地控制 ViewModel 实例的生命周期,从而提高了应用程序的性能和稳定性。

2. ViewModelProviderViewModelProviders 有何不同?

ViewModelProviderViewModelProviders 的主要区别在于,ViewModelProvider 使用 ViewModelStoreOwnerViewModelProvider.Factory 来创建 ViewModel 实例。这提供了更灵活、更可定制的机制。

3. ViewModelProvider.AndroidViewModelFactory 是什么?

ViewModelProvider.AndroidViewModelFactory 是一个 ViewModelProvider.Factory 实现,它适用于在 Android 应用程序中使用的 ViewModel。它使用应用程序的 Application 上下文来创建 ViewModel 实例。

4. 如何使用 ViewModelProvider 创建 ViewModel 实例?

要使用 ViewModelProvider 创建 ViewModel 实例,我们需要指定 ViewModelStoreOwnerViewModelProvider.Factory。对于在 Android 应用程序中使用的 ViewModel,我们可以使用以下代码:

val model = ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(MyViewModel::class.java)

5. ViewModelStoreOwner 是什么?

ViewModelStoreOwner 是一个接口,用于表示拥有 ViewModelStore 的对象。ViewModelStore 是一个容器,其中存储了与特定 ViewModelStoreOwner 关联的 ViewModel 实例。