2020年初,Google已经弃用了ViewModelProviders类,在androidx生命周期库的2.2.0版本中。
现在不再需要使用ViewModelProviders来创建ViewModel的实例,您可以将Fragment或Activity实例传递给ViewModelProvider构造函数。
如果您使用以下代码:
val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)
如果您看到ViewModelProviders已过时的警告信息,请按以下步骤进行更改,以避免使用过时的库:
在build.gradle(Module:app)文件中,使用版本为2.2.0的生命周期组件:
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation "androidx.activity:activity-ktx:1.1.0"
如果您想从Fragment中使用ViewModel,请使用
implementation "androidx.fragment:fragment-ktx:1.2.2"
fragment-ktx自动包含activity-ktx,因此您不需要在依赖项中同时指定两者。
您需要在android部分中指定Java 8:
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.kgandroid.calculator"
minSdkVersion 17
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner
"androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
kotlinOptions { jvmTarget = "1.8" }
}
在您的Fragment或Activity中,将导入更改为:
import androidx.activity.viewModels
创建ViewModel的代码如下:
val viewModel: CalculatorViewModel by viewModels()
代替val viewModel = ViewModelProviders.of(this).get(CalculatorViewModel::class.java)
使用 viewModel 对象的方式:
val viewModel: CalculatorViewModel by viewModels()
viewModel.newNumber.observe(this, Observer<String> {
stringResult -> newNumber.setText(stringResult)
})
其中newNumber是LiveData对象
如果您想在片段中共享活动的ViewModel,则可以使用以下方法:
val viewModel: CalculatorViewModel by activityViewModels()
这相当于在(deprecated) ViewModelProviders.of()
函数中传递Activity实例。