我看到两个名称相似的类,ViewModelProviders和ViewModelProvider。谁能解释一下这些类之间有什么区别?哪个类实际提供视图模型?
ViewModelProviders
(属于Maven artifact android.arch.lifecycle:extensions)是android.arch.lifecycle
包中的一个类,其中包含ViewModelStore类的实用程序方法,并在使用of()
方法时返回ViewModelProvider
类的对象。
因此,您可以将其视为ViewModelProvider
库类的包装器。
另一方面,ViewModelProvider(属于Maven artifact android.arch.lifecycle:viewmodel)是为范围提供ViewModels
的类。因此,这是可以从类中获得Activity
或Fragment
的默认ViewModelProvider
ViewModelProviders
。
所以,是的!这是为你ViewModel
提供核心逻辑的主类,但你需要从ViewModelProviders
获取它,这返回了这个类来获取ViewModel
。
编辑:
在视图模型版本 2.2.0 之后:
类ViewModelProviders
已被弃用,我们现在可以通过创建它的新实例来直接使用ViewModelProvider
获取ViewModel
。
像这样的东西:ViewModelProvider(this).get(SomeViewModel::class.java)
ViewModelProviderS 类提供 ViewModelProvider 类的实例。对 ViewModelProviders.of("this") 的调用将创建并返回与活动关联的 ViewModelProvider。
另一方面,ViewModelProvider 提供了活动的 ViewModel 实例。调用 ViewModelProviders.get(ExampleViewModel::class.java) 将返回 ExampleViewModel 类的实例
这些函数通常组合在一起,如下所示:
ViewModelProviders.of("this").get(ExampleViewModel::class.java)
@andritK,现在似乎ViewModelProviders
已被弃用。文档说,在这种情况下,我们可以直接使用ViewModelProvider。那么如何将以下代码更改为以下内容:从
inline fun <reified T : ViewModel> Fragment.viewModel(factory: ViewModelProvider.Factory, body: T.() -> Unit): T {
val vm = ViewModelProviders.of(this, factory)[T::class.java]
vm.body()
return vm
}
自
inline fun <reified T : ViewModel> Fragment.viewModel(factory: ViewModelProvider.Factory, body: T.() -> Unit): T {
val vm = ViewModelProvider(this, factory).get(T::class.java)
vm.body()
return vm
}
这行得通吗?