ViewModelProvider 构造函数之间有什么区别

what is the difference between ViewModelProvider constructors

我正在学习 ViewModel,我想知道这些获取 ViewModelProvider 实例的方法之间有什么区别吗?

方法一:

ViewModelProvider viewModelProvider = new ViewModelProvider(getViewModelStore(),
                ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()));
mViewModel = viewModelProvider.get(NoteActivityViewModel.class);

方法B:

mViewModel = new ViewModelProvider(this).get(NoteActivityViewModel.class);

根据 ViewModelProvider(ViewmodelStoreOwner) documentation:

This method will use the default factory if the owner implements HasDefaultViewModelProviderFactory. Otherwise, a ViewModelProvider.NewInstanceFactory will be used.

并且根据 Lifecycle 2.2.0 release notes(添加该构造函数时):

You can pass a Fragment or FragmentActivity to the new ViewModelProvider(ViewModelStoreOwner) constructor to achieve the same functionality when using Fragment 1.2.0.

并且 Fragment 1.2.0 release notes 指出:

SavedStateViewModelFactory is now the default factory used when using by viewModels(), by activityViewModels(), the ViewModelProvider constructor, or ViewModelProviders.of() with a Fragment.

所以 new ViewModelProvider(this) 使用 SavedStateViewModelFactory,除了支持 Saved State module for ViewModel.

之外,它还提供了 AndroidViewModelFactory 提供的所有内容

在使用 Fragment 1.2.0 或更高版本时,没有理由将 ViewModelProvider 与标准工厂之一一起使用 - 该构造函数只有在您拥有自己的自定义工厂时才有用。