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
Solution 3:
ViewModelProviders.of() has been deprecated.
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 Fragment
s 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