I saw two classes with a similar name, ViewModelProviders, and ViewModelProvider. Can anyone explain what are the difference between these classes? which class actually provide the ViewModel?
-
1`ViewModelProviders` is deprecated. Use `ViewModelProvider(this).get(YourViewModel::class.java)`. – CoolMind Mar 30 '21 at 10:53
3 Answers
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.
So, you can think of as wrapper around library class for ViewModelProvider.
On the other hand, ViewModelProvider (belongs to Maven artifact android.arch.lifecycle:viewmodel) is class that provides ViewModels for a scope. So it's default ViewModelProvider for an Activity or a Fragment can be obtained from ViewModelProviders class.
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.
Edit:
After ViewModel version 2.2.0:
Class ViewModelProviders has been deprecated and we can now use ViewModelProvider directly by creating it's new instance for getting ViewModel.
Something like this: ViewModelProvider(this).get(SomeViewModel::class.java)
- 11,592
- 2
- 28
- 58
-
-
1@IgorGanapolsky If you're using latest alpha dependency of `ViewModel` then this API has changed how we used to get `ViewModel`s from `ViewModelProviders`. – Jeel Vankhede Jul 27 '20 at 06:43
-
@JeelVankhede need your help here https://stackoverflow.com/questions/64421965/user-login-is-not-working-using-retrofit-and-viewmodel – IRON MAN Oct 19 '20 at 06:52
The ViewModelProviderS class provides instances of ViewModelProvider class.Your call to ViewModelProviders.of("this") creates and returns a ViewModelProvider associated with the activity.
ViewModelProvider on the other hand provides instances of ViewModel of the Activity. Calling the ViewModelProviders.get(ExampleViewModel::class.java) returns an instance of ExampleViewModel class
These functions usually go together like:
ViewModelProviders.of("this").get(ExampleViewModel::class.java)
- 2,917
- 23
- 46
- 68
- 739
- 5
- 13
@andritK, it seems ViewModelProviders is deprecated now. The docs says we can straight away use ViewModelProvider in this case now. then how about changing below codes to the following:
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?
- 26,189
- 23
- 116
- 147
- 357
- 4
- 16