在片段中获取 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 时,我可以用两种不同的方式编写代码。
- 使用"viewModelStore"
ViewModelProvider(viewModelStore, viewModelFactory).get(FragmentViewModel::class.java)
- 使用"this"
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
构造函数无法获得正确的默认工厂。
在我的片段 class 中,当我获取 viewModel 时,我可以用两种不同的方式编写代码。
- 使用"viewModelStore"
ViewModelProvider(viewModelStore, viewModelFactory).get(FragmentViewModel::class.java)
- 使用"this"
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, aViewModelProvider.NewInstanceFactory
will be used.
ViewModelStore
构造函数无法获得正确的默认工厂。