Android 在片段中获取ViewModel时,我是否应该提供;viewModelStore";或;这";作为ViewModelStore到ViewModelProvider()方法的

Android 在片段中获取ViewModel时,我是否应该提供;viewModelStore";或;这";作为ViewModelStore到ViewModelProvider()方法的,android,android-fragments,mvvm,viewmodel,android-viewmodel,Android,Android Fragments,Mvvm,Viewmodel,Android Viewmodel,在片段类中,当我获取viewModel时,我可以用两种不同的方式编写代码 使用“viewModelStore” 使用“这个” 我的问题是,这两个备选方案之间是否存在任何差异,如果是,哪一个是更好的方法?如果您提供自己的ViewModelProvider.Factory,则没有差异,所以只需使用更简单的方法,this 当然,如果您在Kotlin,您根本不需要直接使用ViewModelProvider,而是希望使用 请注意,如果您没有使用自己的工厂,您应该始终传入一个ViewModelSto

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

  • 使用“viewModelStore”
  • 使用“这个”

我的问题是,这两个备选方案之间是否存在任何差异,如果是,哪一个是更好的方法?

如果您提供自己的
ViewModelProvider.Factory
,则没有差异,所以只需使用更简单的方法,
this

当然,如果您在Kotlin,您根本不需要直接使用
ViewModelProvider
,而是希望使用

请注意,如果您没有使用自己的工厂,您应该始终传入一个
ViewModelStoreOwner
(即
this
),而不只是传入
ViewModelStore
,因为它明确提到:

如果所有者实现,则此方法将使用。否则,将使用


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

谢谢,解释得很好,我想我现在明白了,我没有任何理由使用ViewModelStore,如果我没有提供自己的工厂,甚至是错误的。因此,我永远不会在这种情况下使用它。对于通过viewModels在
中直接传递viewModelFactory,我假设工厂必须在手之前创建,因此必须进行某种依赖注入,对吗?注入工厂肯定是一种常见的用例(例如,在测试时提供模拟viewModels),但这不是使用自定义工厂的要求-您可以使用它将一些特定变量传递到ViewModel的构造函数中,或者使用工厂将一些变量传递给我的ViewModel,但是我主要是问,在我的ViewModel中,目前我不能只调用
viewModels{viewModelFactory}
,因为此时不存在该工厂。我在片段的onCreate方法中创建了它的一个对象,因此我没有访问类顶层工厂的权限。所以我说,为了做到这一点,我希望它必须被注入DI。如果没有,我如何才能访问工厂对象呢?它位于lambda(the
{}
)中的原因是它在您第一次访问ViewModel之前不会计算lambda。这意味着它与
lateinit var
工厂配合使用非常好。哦,哇,我也不知道。非常感谢您提供的所有信息!我现在通过将工厂创建为val来测试它,但它是由lazy创建的
,然后我按照您的建议在viewModels中使用该工厂,它工作得很好。我不知道这是否被认为是一个好的实践,但我的onCreateView在我看来更清晰易读。
ViewModelProvider(viewModelStore, viewModelFactory).get(FragmentViewModel::class.java)
ViewModelProvider(this, viewModelFactory).get(FragmentViewModel::class.java)
val viewModel: FragmentViewModel by viewModels { viewModelFactory }