查看ViewModel的谷歌文档,他们展示了下面如何获取ViewModel的示例代码:
val model = ViewModelProviders.of(this).get(MyViewModel::class.java)
当使用最新的依赖项android.arch.lifecycle:extensions:1.1.1时,没有这样的类ViewModelProviders。
去查看ViewModelProviders的文档,我看到一条评论说:
这个类在API级别1.1.0中已弃用。使用ViewModelProvider。AndroidViewModelFactory
问题是,当尝试使用ViewModelProvider时。AndroidViewModelFactory,找不到一个等效的方法来获取ViewModel的实例。
我尝试做的事情:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
因此,方法的名称创建,我得到一个新的实例的ViewModel每次我调用它,这不是我所追求的。
有什么想法是替换上面已弃用的代码?
更新2020-06-16:目前ViewModelProviders已弃用,不应再使用。这个问题和答案来自2018年底,当时情况并非如此。这个问题和答案也适用于ViewModelProviders的旧架构组件版本,而不是AndroidX版本。
当使用最新的依赖项android.arch.lifecycle:extensions:1.1.1时,没有这样的类ViewModelProviders。
是的,有。为了证明这一点:
在Android Studio 3.2.1中创建一个新项目(使用Kotlin, minSdkVersion 21,“空活动”模板)
将android.arch.lifecycle:extensions:1.1.1添加到app模块的依赖项中
这将给你一个应用/构建。gradle:
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'
}
然后你将看到这个库显示在“外部库”中,并显示该类:
你可以引用这个类:
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)
}
}
在查看ViewModelProviders的文档时,我看到一条评论说:这个类在API级别1.1.0中已弃用。使用ViewModelProvider。AndroidViewModelFactory
该注释位于ViewModelProviders的下面。DefaultFactory类条目,并引用该类,而不是ViewModelProviders:
有什么想法是替换上面已弃用的代码?
使用ViewModelProviders。
从2.2.0开始。生命周期扩展已弃用。请参考谷歌文档。
这是这一页的剪接:
生命周期扩展中的api已弃用。相反,添加
您所需要的特定生命周期工件的依赖关系。
新的库包括:
// ViewModel and lifecycle support for java
implementation "androidx.lifecycle:lifecycle-viewmodel:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-livedata:${versions.lifecycle}"
// ViewModel and lifecycle support for kotlin
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:${versions.lifecycle}"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:${versions.lifecycle}"
JAVA的新代码:
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
或者对于Kotlin来说:
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)