首页 > 解决方案 > 实例化 AndroidViewModel 子类时出现“不是子类型”错误

问题描述

作为一名经验丰富的 iOS 开发人员,我正在制作我的第一个 Android 应用程序,我正在尝试使用一个AndroidViewModel来允许我的运行时状态的跨片段/跨配置更改持久性。我使用AndroidViewModel而不是ViewModel因为我需要访问应用程序上下文来加载一些静态资源。

这是我的 AndroidViewModel 子类:

class QuestsViewModel(application: Application) : AndroidViewModel(application) {
  // Some member state variables
}

我正在尝试从我的主要活动中访问它,onCreate如下所示:

val viewModel = ViewModelProviders.of(this,
  ViewModelProvider.AndroidViewModelFactory(this.application))
    .get(QuestsViewModel::class.java)

但我得到编译器错误:

运算符 fun get(p0: Class) 中为 T 绑定的类型参数:T 不满足:推断类型 QuestsViewModel!不是 ViewModel 的子类型!

我很困惑为什么它认为我的自定义 ViewModel 类不是子类,而 ApplicationViewModel(我继承自)直接继承自 ViewModel?

为了清楚起见,我试图完全用 Kotlin 编写这个项目(如果可能的话)。以防万一,我的 gradle 依赖项是:

    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.google.android.gms:play-services-maps:16.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:support-v4:28.0.0'
    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'

    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.volley:volley:1.1.1'

    def lifecycle_version = "2.0.0"
    implementation "android.arch.lifecycle:extensions:1.1.1"
    implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
    kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"

标签: kotlinandroid-viewmodel

解决方案


供发现此问题的任何人将来参考:我的问题是AndroidViewModel从两个源文件中的两个不同包中导入类 - 一个来自 androidx 命名空间,一个不是。

将我所有的 gradle 包迁移到 androidx 版本(如果可能)并更新所有import语句解决了这个问题。


推荐阅读