问题描述
查看 ViewModel 的 Google 文档,他们展示了以下关于如何获取 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 时,找不到等效的of 方法来获取ViewModel 的实例.
我尝试做什么:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)因此方法名为 create,我每次调用它时都会得到一个新的 ViewModel 实例,这不是我想要的.
有什么想法可以替换上面不推荐使用的代码吗?
UPDATE 2020-06-16:目前 ViewModelProviders 已弃用,不应再使用.这个问题和答案来自 2018 年底,当时情况并非如此.此问题和答案也适用于 ViewModelProviders 的旧架构组件版本,而不是 AndroidX 版本.
当使用最新的依赖android.arch.lifecycle:extensions:1.1.1时没有ViewModelProviders这个类.
是的,有.为了证明这一点:
在 Android Studio 3.2.1 中创建一个新项目(使用 Kotlin,
minSdkVersion21,空活动"模板)在
app模块的依赖中添加android.arch.lifecycle:extensions:1.1.1
这会给你一个 app/build.gradle 像:
应用插件:'com.android.application'应用插件:'kotlin-android'应用插件:'kotlin-android-extensions'安卓 {compileSdkVersion 28默认配置 {应用程序IDcom.commonsware.myandroidarch"minSdkVersion 21targetSdkVersion 28版本代码 1版本名称1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}构建类型 {发布 {缩小启用假proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}}依赖{实现文件树(目录:'libs',包括:['*.jar'])实施org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"实施 'com.android.support:appcompat-v7:28.0.0'实施 'com.android.support.constraint:constraint-layout:1.1.3'实现 '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'}然后您将看到该库与该类一起显示在外部库"中:
您将能够引用该类:
包 com.commonsware.myandroidarch导入 android.arch.lifecycle.ViewModelProviders导入 android.support.v7.app.AppCompatActivity导入 android.os.Bundle类 MainActivity : AppCompatActivity() {覆盖 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.
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?
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.
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.
这篇关于ViewModelProviders 在 1.1.0 中已弃用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)