本文介绍了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 实例,这不是我想要的.

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

解决方案

UPDATE 2020-06-16:目前 ViewModelProviders 已弃用,不应再使用.这个问题和答案来自 2018 年底,当时情况并非如此.此问题和答案也适用于 ViewModelProviders 的旧架构组件版本,而不是 AndroidX 版本.

当使用最新的依赖android.arch.lifecycle:extensions:1.1.1时没有ViewModelProviders这个类.

是的,有.为了证明这一点:

  • 在 Android Studio 3.2.1 中创建一个新项目(使用 Kotlin,minSdkVersion 21,空活动"模板)

  • 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:

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.


Yes, there is. To demonstrate this:

  • Create a new project in Android Studio 3.2.1 (with Kotlin, minSdkVersion 21, "empty activity" template)

  • Add android.arch.lifecycle:extensions:1.1.1 to the dependencies of the app module

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)
  }
}

That comment is underneath the ViewModelProviders.DefaultFactory class entry and refers to that class, not ViewModelProviders:

Use ViewModelProviders.

这篇关于ViewModelProviders 在 1.1.0 中已弃用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-07 06:37