使用ViewModelStore中的键取回ViewModel实例

时间:2019-06-04 09:22:20

标签: android mvvm viewmodel android-jetpack

我正在更深入地研究ViewModelProvider,并在ViewModelProvider中找到了 2个get方法,如下所示

@NonNull
public <T extends ViewModel> T get(@NonNull Class<T> modelClass) {
    String canonicalName = modelClass.getCanonicalName();
    if (canonicalName == null) {
        throw new IllegalArgumentException("Local and anonymous classes can not be ViewModels");
    }
    return get(DEFAULT_KEY + ":" + canonicalName, modelClass);
}

@NonNull
@MainThread
public <T extends ViewModel> T get(@NonNull String key, @NonNull Class<T> modelClass) {
    ViewModel viewModel = mViewModelStore.get(key);

    if (modelClass.isInstance(viewModel)) {
        //noinspection unchecked
        return (T) viewModel;
    } else {
        //noinspection StatementWithEmptyBody
        if (viewModel != null) {
            // TODO: log a warning.
        }
    }

    viewModel = mFactory.create(modelClass);
    mViewModelStore.put(key, viewModel);
    //noinspection unchecked
    return (T) viewModel;
}

第一个很简单,我们通常都使用它。第二个似乎除了ViewModel类实例之外,还要求一个键字符串,它使用该键将ViewModel存储在 ViewModelStore 类内的HashMap中。

现在,ViewModelStore有两种方法,放置获取,因为您可以期望任何类都可以在HashMap上使用。但这是我的问题,

  1. 在什么情况下我应该使用第二种get方法?
  2. 如何使用ViewModelStore中的相同键取回ViewModel实例?
  3. 我应该在谁的上下文上调用ViewModelStore的get方法?

0 个答案:

没有答案