25

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?

Abhishek Kumar
  • 4,532
  • 5
  • 31
  • 53
  • 1
    `ViewModelProviders` is deprecated. Use `ViewModelProvider(this).get(YourViewModel::class.java)`. – CoolMind Mar 30 '21 at 10:53

3 Answers3

22

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)

Jeel Vankhede
  • 11,592
  • 2
  • 28
  • 58
0

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
ardritkrasniqi
  • 739
  • 5
  • 13
0

@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?

IgorGanapolsky
  • 26,189
  • 23
  • 116
  • 147
binrebin
  • 357
  • 4
  • 16