kotlin - 实例化 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"
解决方案
供发现此问题的任何人将来参考:我的问题是AndroidViewModel
从两个源文件中的两个不同包中导入类 - 一个来自 androidx 命名空间,一个不是。
将我所有的 gradle 包迁移到 androidx 版本(如果可能)并更新所有import
语句解决了这个问题。
推荐阅读
- python - Heroku Postgres 非永久凭证
- python - Python网页抓取,程序无法启动
- excel - 如何以 PDF 格式打开 Excel Online 文档
- neo4j - Neo4j 中的着色方舟(关系)
- r - 如何从 R 中的 nowcast 函数中提取新闻?
- elasticsearch - Elasticsearch 按字段分组并获取包含超过 2 个文档的存储桶的数量
- javascript - 在浏览器中录制音频和视频
- php - PHP:有什么方法可以隐藏 VS Code 中指定的已弃用类的警告?
- sql - 如何在表中查找特定组 ID 的特定字符串值?
- python - 在 ubuntu 20.04 上安装 taichi legacy 分支