ViewModelProviders 和 ViewModelProvider class 有什么区别?

What is the difference between ViewModelProviders and ViewModelProvider class?

我看到两个 class 具有相似名称的 ViewModelProviders 和 ViewModelProvider。谁能解释一下这些 class 之间的区别是什么?哪个 class 实际上提供了 ViewModel?

ViewModelProviders (belongs to Maven artifact android.arch.lifecycle:extensions) is a class from android.arch.lifecycle package which contains utilities methods for ViewModelStore class & returns 你对象是 ViewModelProvider class 当你使用它的 of() 方法时。

因此,您可以将 class 库视为 ViewModelProvider 的包装器。

另一方面,ViewModelProvider (属于Maven神器android.arch.lifecycle:viewmodel)是class提供ViewModels 范围。因此,Activity 的默认 ViewModelProviderFragment 可以从 ViewModelProviders class.

获得

所以,是的!这是为您的 ViewModel 提供核心逻辑的主要 class,但您需要从 ViewModelProviders 获得它,您 returns 这个 class 从.

获得ViewModel

编辑:

ViewModel version 2.2.0之后:

Class ViewModelProviders 已被弃用,我们现在可以通过创建新实例直接使用 ViewModelProvider 来获取 ViewModel.

像这样:ViewModelProvider(this).get(SomeViewModel::class.java)

ViewModelProviderS class 提供 ViewModelProvider 的实例 class.Your 调用 ViewModelProviders.of("this") 创建并 returns 与 [=22] 关联的 ViewModelProvider =].

ViewModelProvider 另一方面提供 Activity 的 ViewModel 实例。调用 ViewModelProviders.get(ExampleViewModel::class.java) returns ExampleViewModel class

的实例

这些函数通常像这样组合在一起:

ViewModelProviders.of("this").get(ExampleViewModel::class.java)

@andritK,ViewModelProviders 现在似乎已被弃用。文档说我们现在可以在这种情况下直接使用 ViewModelProviders。那么如何将下面的代码更改为以下代码: 来自

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
}

Does this work?