什么是 ViewModelStore 和 viewModelStoreOwner?

Anm*_*mol 28 android android-fragments android-activity android-viewmodel

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

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

#1

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

#2

public ViewModelProvider(@NonNull ViewModelStoreOwner owner, @NonNull Factory factory) {
        this(owner.getViewModelStore(), factory);
    }
Run Code Online (Sandbox Code Playgroud)

#3

 public ViewModelProvider(@NonNull ViewModelStore store, @NonNull Factory factory) {
        mFactory = factory;
        mViewModelStore = store;
    }
Run Code Online (Sandbox Code Playgroud)

Gradle依赖:

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0-rc02"
Run Code Online (Sandbox Code Playgroud)

所以这些构造函数的 require ViewModelStoreviewModelStoreOwner.

文件:

@param store {@code ViewModelStore} 将存储 ViewModel 的位置。

@param owner 一个 {@code ViewModelStoreOwner},其 {@link ViewModelStore} 将用于保留 {@code ViewModels}


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


ViewModelStoreOwner==activity/fragment 是什么?

Sag*_*gar 23

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

ViewModelStore可以将A视为将 ViewModel 存储在HashMap. 其中keyis 字符串值和 value 是正在保存的 ViewModel(ViewModelProvider使用string_key+ ViewModel 类规范名称的串联)。

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

我们可以根据需求实现我们自己版本的所有者和状态。

ViewModelStoreOwner==activity/fragment 是什么?

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

  • “Application”类可以是 ViewModelStoreOwner 吗? (3认同)
  • @dejavu89 ```ViewModelStoreOwner``` 只是一个接口。您只需要实现他们的方法即可。```class MyApplication : ViewModelStoreOwner { private val appViewModelStore: ViewModelStore by lazy { ViewModelStore() } override fun getViewModelStore(): ViewModelStore { return appViewModelStore } }``` (3认同)