简体   繁体   English

ViewModelProviders 和 ViewModelProvider 类有什么区别?

[英]What is the difference between ViewModelProviders and ViewModelProvider class?

I saw two classes with a similar name, ViewModelProviders, and ViewModelProvider.我看到了两个名称相似的类,ViewModelProviders 和 ViewModelProvider。 Can anyone explain what are the difference between these classes?任何人都可以解释这些课程之间的区别是什么? which class actually provide the ViewModel?哪个类实际上提供了 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 you object of ViewModelProvider class when you use of() method from it. ViewModelProviders (属于 Maven 工件 android.arch.lifecycle:extensions)android.arch.lifecycle包中的一个类,它包含ViewModelStore类的实用程序方法,并在您使用of()方法时返回ViewModelProvider类的对象。

So, you can think of as wrapper around library class for ViewModelProvider .因此,您可以将其视为ViewModelProvider库类的包装器。

On the other hand, ViewModelProvider (belongs to Maven artifact android.arch.lifecycle:viewmodel) is class that provides ViewModels for a scope.另一方面, ViewModelProvider (属于 Maven 工件 android.arch.lifecycle:viewmodel)是为范围提供ViewModels类。 So it's default ViewModelProvider for an Activity or a Fragment can be obtained from ViewModelProviders class.因此,它是Activity的默认ViewModelProvider ,或者可以从ViewModelProviders类中获取Fragment

So, yes !所以,是的! this is the main class that provides core logic for your ViewModel , but you'll need to obtain it from ViewModelProviders which returns you this class to obtain ViewModel from.这是为您的ViewModel提供核心逻辑的主类,但您需要从ViewModelProviders获取它,它返回此类以从中获取ViewModel

Edit:编辑:

After ViewModel version 2.2.0 :ViewModel 2.2.0 版之后:

Class ViewModelProviders has been deprecated and we can now use ViewModelProvider directly by creating it's new instance for getting ViewModel .ViewModelProviders已被弃用,我们现在可以通过创建它的新实例来直接使用ViewModelProvider来获取ViewModel

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

The ViewModelProviderS class provides instances of ViewModelProvider class.Your call to ViewModelProviders.of("this") creates and returns a ViewModelProvider associated with the activity. ViewModelProviderS 类提供 ViewModelProvider 类的实例。您对 ViewModelProviders.of("this") 的调用会创建并返回与活动关联的 ViewModelProvider。

ViewModelProvider on the other hand provides instances of ViewModel of the Activity.另一方面,ViewModelProvider 提供了 Activity 的 ViewModel 实例。 Calling the ViewModelProviders.get(ExampleViewModel::class.java) returns an instance of ExampleViewModel class调用 ViewModelProviders.get(ExampleViewModel::class.java) 返回 ExampleViewModel 类的实例

These functions usually go together like:这些功能通常一起使用,例如:

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

@andritK, it seems ViewModelProviders is deprecated now. @andritK,现在似乎不推荐使用 ViewModelProviders。 The docs says we can straight away use ViewModelProviders in this case now.文档说我们现在可以在这种情况下直接使用 ViewModelProviders。 then how about changing below codes to the following: FROM那么如何将以下代码更改为以下内容: 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
}

TO

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?这行得通吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ViewModelProvider 构造函数有什么区别 - what is the difference between ViewModelProvider constructors 传递“这个”和“活动!!”有什么区别? 在创建 ViewModelProvider 实例时作为 ViewModelStoreOwner - What is the difference between passing“this” and “activity!!” as a ViewModelStoreOwner while creating ViewModelProvider instance ViewModelProvider.Factory 和 ViewModelProvider.NewInstanceFactory 有什么区别? - What are the differences between ViewModelProvider.Factory and ViewModelProvider.NewInstanceFactory? 如何在 JAVA 中弃用 ViewModelProviders 后实现 ViewModelProvider - How to implement ViewModelProvider after ViewModelProviders deprecated in JAVA 我应该使用 ViewModelProvider 而不是 ViewModelProviders 吗? 如果是这样,为什么? - Should I be using ViewModelProvider instead of ViewModelProviders? If so, why? Class &lt;*&gt;和Class有什么区别<T> - What's the difference between Class<*> and Class<T> 基类中的ViewModelProviders.get(...) - ViewModelProviders.get(…) in base class ViewModelProviders 弃用的正确替代品是什么? - What is the proper replacement for ViewModelProviders deprecation? ViewModelProviders 已经过时了,应该换什么? - ViewModelProviders is outdated, what should be replaced? 片段中的 ViewModelProvider 使用什么 ViewModelStoreOwner? - What ViewModelStoreOwner to use for ViewModelProvider in Fragment?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM