ViewModelProviders在1.1.0中已弃用

问题描述 投票:6回答:4

看看Google docsViewModel,他们展示了如何获得ViewModel的以下示例代码:

val model = ViewModelProviders.of(this).get(MyViewModel::class.java)

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

documentationViewModelProviders,我看到一条评论说:

此类在API级别1.1.0中已弃用。使用ViewModelProvider.AndroidViewModelFactory

问题是,当试图使用ViewModelProvider.AndroidViewModelFactory时,找不到等效的of方法来获取ViewModel的实例。

我尝试做什么:

ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)

因此,create方法的名称,我每次调用它时都得到一个ViewModel的新实例,这不是我所追求的。

有什么想法替换上面的弃用代码?

android android-gradle android-architecture-components android-viewmodel
4个回答
6
投票

当使用最新的依赖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


0
投票

它应该这样工作

 viewModel = ViewModelProviders.of(this@MainActivity).get(MainActivityViewModel::class.java)

0
投票

没有关于get方法的deprecated。如果您按照Android Developer说明进行操作,那么您应该像这样获得VM

public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
    // Create a ViewModel the first time the system calls an activity's onCreate() method.
    // Re-created activities receive the same MyViewModel instance created by the first activity.

    MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
    model.getUsers().observe(this, users -> {
        // update UI
    });
  }
}

以下是关于how to use ViewModels的说明以下是有关如何设置project with the correct dependencies的说明

enter image description here

enter image description here


0
投票

是的@Tarek,它已被弃用。立即使用AndroidX:

val yourViewModel = ViewModelProvider.NewInstanceFactory().create(YourVideoModel::class.java)
© www.soinside.com 2019 - 2024. All rights reserved.