[英]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.