ViewModelProviders 在 1.1.0 中已弃用

新手上路,请多包涵

查看 ViewModelGoogle 文档,他们展示了以下关于如何获取 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 的新实例,这不是我所追求的。

有什么想法可以替换上面不推荐使用的代码吗?

原文由 TareK Khoury 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 903
2 个回答

更新 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 模块的依赖项中

这会给你一个 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'
}

然后,您将看到该库与该类一起显示在“外部库”中:

外部库

您将能够引用该类:

 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

原文由 CommonsWare 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试在 build.gradle 模块级别添加此代码

 android {
 kotlinOptions {
    freeCompilerArgs += [
        '-Xjvm-default=enable'
    ]
  }
}

原文由 Pravin Yadav 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题