Looking at the Google docs for ViewModel, they show the below sample code on how to get a ViewModel:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
When using the latest dependency android.arch.lifecycle:extensions:1.1.1 there is no such class ViewModelProviders.
Going to the documentation for ViewModelProviders, I saw a comment saying:
This class was deprecated in API level 1.1.0. Use ViewModelProvider.AndroidViewModelFactory
The problem is, when trying to use ViewModelProvider.AndroidViewModelFactory, cannot find an equivalent of method to get the instance of the ViewModel.
What i tried doing:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
Hence the name of the method create, I get a new instance of the ViewModel every-time I call it, which is not what I am after.
Any ideas what is the replacement of deprecated code above?
When using the latest dependency
android.arch.lifecycle:extensions:1.1.1there is no such classViewModelProviders.
Yes, there is. To demonstrate this:
Create a new project in Android Studio 3.2.1 (with Kotlin,
minSdkVersion21, "empty activity" template)Add
android.arch.lifecycle:extensions:1.1.1to the dependencies of theappmodule
This will give you an app/build.gradle like:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.commonsware.myandroidarch"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'android.arch.lifecycle:extensions:1.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
You will then see that library show up in "External Libraries" with that class:
And you will be able to reference that class:
package com.commonsware.myandroidarch
import android.arch.lifecycle.ViewModelProviders
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val provider = ViewModelProviders.of(this)
}
}
Going to the documentation for ViewModelProviders, I saw a comment saying: This class was deprecated in API level 1.1.0. Use ViewModelProvider.AndroidViewModelFactory
That comment is underneath the ViewModelProviders.DefaultFactory class entry and refers to that class, not ViewModelProviders:
Any ideas what is the replacement of deprecated code above?
Use ViewModelProviders.
I use lifecycle-extensions 2.2.0-alpha03 version:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha03'
It should be work, using ViewModelProvider constructor.
// With ViewModelFactory
val viewModel = ViewModelProvider(this, YourViewModelFactory).get(YourViewModel::class.java)
//Without ViewModelFactory
val viewModel = ViewModelProvider(this).get(YourViewModel::class.java)
As @FantasyFang mentioned in his answer, use the lastest version for the lifecycle:lifecycle-extensions which in this moment is 2.2.0-alpha03. So you should add in your build.gradle file the following line:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha03'
For those who are using Java, to solve this, pass those arguments directly to ViewModelProvider's constructor:
MyViewModel viewModel = new ViewModelProvider(this, myViewModelFactory).get(MyViewModel.class);
Or if you don't use a factory, simply use:
MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);
Without passing your the factory object.
Probably you can just use:
val viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(MyViewModel::class.java)
without needing to add android.arch.lifecycle:extensions:1.1.1 as the dependency.
Yes @Tarek, it is deprecated. Use now with AndroidX:
val yourViewModel = ViewModelProvider.NewInstanceFactory().create(YourVideoModel::class.java)
it should work this way
viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.java)
There is nothing about the get method that is deprecated. If you follow the Android Developer instructions then you should get the VM like this.
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
// Create a ViewModel the first time the system calls an activity's onCreate() method.
// Re-created activities receive the same MyViewModel instance created by the first activity.
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
Here is the instructions on how to use ViewModels
Here is the instructions on how to set up your project with the correct dependencies
来源:https://stackoverflow.com/questions/53903762/viewmodelproviders-is-deprecated-in-1-1-0

