我看到两个类名很相似的类,一个是ViewModelProviders,另一个是ViewModelProvider。有人能解释一下这两个类之间的区别吗?哪个类提供了ViewModel?
ViewModelProviders (属于 Maven artifact android.arch.lifecycle:extensions) 是一个类,位于 android.arch.lifecycle
包中,包含了 ViewModelStore 类的实用方法,并在使用其 of()
方法时返回 ViewModelProvider
类的对象。
因此,您可以将其视为对 ViewModelProvider
库类的包装器。
另一方面,ViewModelProvider (属于 Maven artifact android.arch.lifecycle:viewmodel) 是为一个范围提供 ViewModels
的类。所以它是一个默认的 ViewModelProvider
用于 Activity
或 Fragment
可以从 ViewModelProviders
类中获得。
是的!这是提供您的 ViewModel
的核心逻辑的主要类,但您需要从 ViewModelProviders
中获取它,该类会返回这个类,以便从中获取 ViewModel
。
编辑:
在 ViewModel 版本 2.2.0 后:
ViewModelProviders
类已被弃用,现在我们可以直接使用 ViewModelProvider
,通过创建其实例来获取 ViewModel
。
像这样: ViewModelProvider(this).get(SomeViewModel::class.java)
ViewModel
alpha 依赖项,则此 API 已更改我们以前从 ViewModelProviders
获取 ViewModel
的方式。 - Jeel Vankhede@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
}
reified
的必要性是什么? - IgorGanapolskyViewModelProviderS类提供了ViewModelProvider类的实例。您对ViewModelProviders.of("this")的调用将创建并返回与该活动关联的ViewModelProvider。
另一方面,ViewModelProvider提供了Activity的ViewModel实例。调用ViewModelProviders.get(ExampleViewModel::class.java)将返回ExampleViewModel类的实例。
这些函数通常一起使用:
ViewModelProviders.of("this").get(ExampleViewModel::class.java)
ViewModelProviders
已被弃用。请使用ViewModelProvider(this).get(YourViewModel::class.java)
。 - CoolMind