在片段中获取 ViewModel 时,我应该将 "viewModelStore" 还是 "this" 作为 ViewModelStore 提供给 ViewModelProvider() 方法

When getting the ViewModel in a fragment, should I provide "viewModelStore" or "this" as the ViewModelStore to the ViewModelProvider() method

在我的片段 class 中,当我获取 viewModel 时,我可以用两种不同的方式编写代码。

ViewModelProvider(viewModelStore, viewModelFactory).get(FragmentViewModel::class.java)
ViewModelProvider(this, viewModelFactory).get(FragmentViewModel::class.java)

我的问题是,这两种选择之间是否存在任何差异?如果存在,哪一种是更可取的方法?

如果您提供自己的 ViewModelProvider.Factory,则没有区别,所以只使用更简单的 this

当然,如果你在 Kotlin 中,你根本不需要直接使用 ViewModelProvider,而是想使用 Fragment KTX 并使用

val viewModel: FragmentViewModel by viewModels { viewModelFactory }

请注意,如果您 使用自己的工厂,则应始终传递 ViewModelStoreOwner(即 this)而不是仅仅传递在 ViewModelStore 中,因为 the Javadoc 明确提到:

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

ViewModelStore 构造函数无法获得正确的默认工厂。