查看Google docs中的ViewModel,他们显示了以下示例代码,说明如何获取ViewModel:

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

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

转到documentation以获得ViewModelProviders,我看到一条评论说:



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

我尝试做的是:
ViewModelProvider.AndroidViewModelFactory.getInstance(application).create(PlayerViewHolder::class.java)

因此,方法名称create,每次调用时都会得到一个ViewModel的新实例,而这并不是我想要的。

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

最佳答案

2020年6月16日更新:目前不推荐使用ViewModelProviders,不应再使用它。这个问题和答案来自2018年末,当时情况并非如此。这个问题和答案也适用于ViewModelProviders的旧版Architecture Components版本,而不是AndroidX版本。



就在这里。为了证明这一点:

  • 在Android Studio 3.2.1中创建一个新项目(使用Kotlin,minSdkVersion 21,“空 Activity ”模板)
  • 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.DefaultFactory类条目的下面,并且引用该类,而不是ViewModelProviders:



    使用ViewModelProviders

    10-08 12:23