ViewModelProviders和ViewModelProvider类有什么区别?

25

我看到两个类名很相似的类,一个是ViewModelProviders,另一个是ViewModelProvider。有人能解释一下这两个类之间的区别吗?哪个类提供了ViewModel?


1
ViewModelProviders已被弃用。请使用ViewModelProvider(this).get(YourViewModel::class.java) - CoolMind
3个回答

22

ViewModelProviders (属于 Maven artifact android.arch.lifecycle:extensions) 是一个类,位于 android.arch.lifecycle 包中,包含了 ViewModelStore 类的实用方法,并在使用其 of() 方法时返回 ViewModelProvider 类的对象。

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

另一方面,ViewModelProvider (属于 Maven artifact android.arch.lifecycle:viewmodel) 是为一个范围提供 ViewModels 的类。所以它是一个默认的 ViewModelProvider 用于 ActivityFragment 可以从 ViewModelProviders 类中获得。

是的!这是提供您的 ViewModel 的核心逻辑的主要类,但您需要从 ViewModelProviders 中获取它,该类会返回这个类,以便从中获取 ViewModel

编辑:

ViewModel 版本 2.2.0 后:

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

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


我们应该使用哪个API呢? - IgorGanapolsky
1
如果您正在使用最新的 ViewModel alpha 依赖项,则此 API 已更改我们以前从 ViewModelProviders 获取 ViewModel 的方式。 - Jeel Vankhede
@JeelVankhede 在这里需要你的帮助 https://dev59.com/w73pa4cB1Zd3GeqPlMcC - IRON MAN

0

@andritK,看起来ViewModelProviders现在已经被弃用了。文档说我们现在可以直接使用ViewModelProvider。那么如何将下面的代码更改为以下内容:

FROM
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 的必要性是什么? - IgorGanapolsky

0

ViewModelProviderS类提供了ViewModelProvider类的实例。您对ViewModelProviders.of("this")的调用将创建并返回与该活动关联的ViewModelProvider。

另一方面,ViewModelProvider提供了Activity的ViewModel实例。调用ViewModelProviders.get(ExampleViewModel::class.java)将返回ExampleViewModel类的实例。

这些函数通常一起使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接