作为一个经验丰富的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中输入T的参数绑定get(p0:Class):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
语句解决了这个问题。