问题描述
查看 Google文档中的ViewModel
,它们显示以下内容有关如何获取ViewModel
的示例代码:
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)
使用最新的依赖项android.arch.lifecycle:extensions:1.1.1
时,没有此类ViewModelProviders
.
When using the latest dependency android.arch.lifecycle:extensions:1.1.1
there is no such class ViewModelProviders
.
转到ViewModelProviders
的文档,我看到了评论说:
Going to the documentation for ViewModelProviders
, I saw a comment saying:
问题是,当尝试使用ViewModelProvider.AndroidViewModelFactory
时,找不到等效的of
方法来获取ViewModel
的实例.
The problem is, when trying to use ViewModelProvider.AndroidViewModelFactory
, cannot find an equivalent of
method to get the instance of the ViewModel
.
我尝试做的事情:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)
由于方法create
的名称,每次调用它时我都会得到一个ViewModel的新实例,这不是我想要的.
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?
推荐答案
UPDATE 2020-06-16 :当前 ViewModelProviders
已被弃用,不应再使用.这个问题和答案来自2018年末,当时情况并非如此.这个问题和答案也适用于ViewModelProviders
的较旧的Architecture Components版本,而不是AndroidX版本.
UPDATE 2020-06-16: Presently ViewModelProviders
is deprecated and should no longer be used. This question and answer were from late 2018, when that was not the case. This question and answer are also for the older Architecture Components edition of ViewModelProviders
, not the AndroidX edition.
是的,有.为了证明这一点:
Yes, there is. To demonstrate this:
-
在Android Studio 3.2.1中创建一个新项目(使用Kotlin,
minSdkVersion
21,空活动"模板)
Create a new project in Android Studio 3.2.1 (with Kotlin,
minSdkVersion
21, "empty activity" template)
将android.arch.lifecycle:extensions:1.1.1
添加到app
模块的依赖项
这将为您提供app/build.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'
}
然后您将看到该库显示在该类的外部库"中:
You will then see that library show up in "External Libraries" with 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)
}
}
该注释位于ViewModelProviders.DefaultFactory
类条目的下面,并且引用该类,而不是ViewModelProviders
:
That comment is underneath the ViewModelProviders.DefaultFactory
class entry and refers to that class, not ViewModelProviders
:
使用ViewModelProviders
.
这篇关于ViewModelProviders在1.1.0中已弃用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!