什么是 ViewModelStore 和 viewModelStoreOwner?

What is ViewModelStore and viewModelStoreOwner?

由于这个新的 ViewModelProvider,我感到很困惑 api(不推荐使用 ViewModelProvider)

与新的变化一样,也有新的构造函数(源代码)。

#1

public ViewModelProvider(@NonNull ViewModelStoreOwner owner) {
        this(owner.getViewModelStore(), owner instanceof HasDefaultViewModelProviderFactory
                ? ((HasDefaultViewModelProviderFactory) owner).getDefaultViewModelProviderFactory()
                : NewInstanceFactory.getInstance());
    }

#2

public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) {
        this(owner.getViewModelStore(), factory);
    }

#3

 public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) {
        mFactory = factory;
        mViewModelStore = store;
    }

Gradle 依赖性:

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0-rc02"

所以这些构造函数需要 ViewModelStoreviewModelStoreOwner

文档:

@param store {@code ViewModelStore} where ViewModels will be stored.

@param owner a {@code ViewModelStoreOwner} whose {@link ViewModelStore} will be used to retain {@code ViewModels}


任何人都可以定义它们、如何使用它们以及它们对我们开发人员的真正意义吗?


是 ViewModelStoreOwner==activity/fragment?

Can anyone define them and how to use them and what they really mean to us developer's?

一个ViewModelStore可以被认为是一个容器,将ViewModels存储在一个HashMap中。其中 key 是字符串值,值是要保存的 ViewModel(ViewModelProvider 使用 string_key + ViewModel class 规范名称的串联)。

A ViewModelStoreOwner 只是一个接口。任何实现此接口定义的 getViewModelStore() 的 class 成为 ViewModelStore 的所有者。这个 class 然后维护 ViewModelStore 并且应该负责在需要时适当地恢复它。

我们可以根据需求实现自己版本的owner和state。

is ViewModelStoreOwner==activity/fragment?

是的。基于 Android 源代码,Fragment(来自 androidx.fragment.app)和 ComponentActivity(来自 androidx.activity)都实现了 ViewModelStoreOwner。这些 classes 维护一个 viewModelStore 并适当地恢复值。