As ViewModelProviders.of() is deprecated, how should I create object of ViewModel?

Solution 1:

Simply replace:

This:

boardViewModel = ViewModelProviders.of(this).get(BoardViewModel::class.java)

With this:

boardViewModel = ViewModelProvider(this).get(BoardViewModel::class.java)

Solution 2:

This Gradle upgrade created the problem for me.

FROM

implementation 'androidx.core:core:1.1.0'

TO

implementation 'androidx.core:core:1.2.0'

IN MAIN ACTIVITY Java/Kotlin Files

This import statement

import androidx.lifecycle.ViewModelProviders

had to be changed to

import androidx.lifecycle.ViewModelProvider

This KOTLIN viewModel statement

viewModel = ViewModelProviders.of(this).get(MainActivityViewModel::class.java)

had to be changed to

viewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)

and in JAVA

This line of JAVA code

mViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);

had to be changed to

mViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

and then it all worked for me.

Based on: An outline of the steps that created the problem for me enter image description here

Solution 3:

ViewModelProviders.of() has been deprecated. enter image description here

Use ViewModelProvider constructors directly as they now handle the default ViewModelProvider.Factory role.

Java

 mainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);

Kotlin

mainActivityViewModel = ViewModelProvider(this).get(MainActivityViewModel::class.java)

Solution 4:

Instead of ViewModelProviders we should now use ViewModelProvider constructors and it has three:

public ViewModelProvider(ViewModelStoreOwner owner)
public ViewModelProvider(ViewModelStoreOwner owner, Factory factory)
public ViewModelProvider(ViewModelStore store, Factory factory)

1. If you are not using a ViewModelProvider.Factory to pass additional arguments to your ViewModel, you can use the first one. so:

viewModel = ViewModelProviders.of(this).get(YourViewModel.class);

can be replaced with:

viewModel = new ViewModelProvider(this).get(YourViewModel.class);

AppCompatActivity and different kinds of Fragments are indirect subclasses of ViewModelStoreOwner (see the complete list of its known subclasses here), so you can use them in this constructor.

2. But if you are using a ViewModelProvider.Factory, you should use the second or the third constructors:

viewModel = ViewModelProviders.of(this, viewModelFactory).get(YourViewModel.class);

can be replaced with:

viewModel = new ViewModelProvider(this, viewModelFactory).get(YouViewModel.class);

OR based on the documentation of ViewModelStore:

Use ViewModelStoreOwner.getViewModelStore() to retrieve a ViewModelStore for activities and fragments.

viewModel = new ViewModelProvider(getViewModelStore(), viewModelFactory).get(YourViewModel.class);

Solution 5:

ViewModelProviders.of() has been deprecated. You can pass a Fragment or FragmentActivity to the new ViewModelProvider(ViewModelStoreOwner) constructor to achieve the same functionality. (aosp/1009889)

Please click here to see the solution