查看ViewModel的谷歌文档,他们展示了下面如何获取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,找不到一个等效的方法来获取ViewModel的实例。

我尝试做的事情:

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

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

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


当前回答

用这个:

YourViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);

其他回答

它应该这样工作

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

这个答案是针对Java的,但你可以理解要点。解决方案是你需要使用ViewModelProvider,因为ViewModelProviders已弃用:

//Do not forget import it.
import androidx.lifecycle.AndroidViewModel;

ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);

示例用法如下:

YourViewModel yourViewModel = new ViewModelProvider.AndroidViewModelFactory(getApplication()).create(YourViewModel.class);

另外,不要忘记更新Gradle Dependencies:查看它们的最新版本

implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0'
annotationProcessor 'androidx.lifecycle:lifecycle-compiler:2.2.0'

! !然而,要小心,因为一些答案推荐了这个解决方案,但对我来说并不管用:

yourViewModel = new ViewModelProvider(this).get(YourViewModel.class);

因为当我使用这种方式时,我得到了下面的错误消息:

导致原因:java.lang.RuntimeException:不能创建类com. canerkasler .mvvmexample. viewmodel的实例

我用的是工厂。

ViewModelProvider.AndroidViewModelFactory
            .getInstance(getApplication())
            .create(DashboardViewModel.class);

试试这个…

 LocationViewModel locationViewModel = new ViewModelProvider(this).get(LocationViewModel.class);

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

这将给你一个应用/构建。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。