"Not a subtype" 实例化 AndroidViewModel 子类时出错
"Not a subtype" error when instantiating AndroidViewModel subclass
作为经验丰富的 iOS 开发人员制作我的第一个 Android 应用程序,我正在尝试使用 AndroidViewModel
允许 cross-fragment/cross-configuration-change 持久化我的运行时状态。我使用 AndroidViewModel
而不是 ViewModel
因为我需要访问应用程序上下文来加载一些静态资源。
这是我的 AndroidViewModel 子class:
class QuestsViewModel(application: Application) : AndroidViewModel(application) {
// Some member state variables
}
我正在尝试从我的主 activity 的 onCreate
访问它,如下所示:
val viewModel = ViewModelProviders.of(this,
ViewModelProvider.AndroidViewModelFactory(this.application))
.get(QuestsViewModel::class.java)
但是我得到编译器错误:
Type parameter bound for T in operator fun get(p0: Class): T
is not satisfied: inferred type QuestsViewModel! is not a subtype of ViewModel!
我很困惑为什么它认为我的自定义 ViewModel class 不是子 class,当 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
class - 一个来自 androidx 命名空间,一个不。
将我所有的 gradle 包迁移到 androidx 版本(如果可能)并更新所有 import
语句解决了问题。
作为经验丰富的 iOS 开发人员制作我的第一个 Android 应用程序,我正在尝试使用 AndroidViewModel
允许 cross-fragment/cross-configuration-change 持久化我的运行时状态。我使用 AndroidViewModel
而不是 ViewModel
因为我需要访问应用程序上下文来加载一些静态资源。
这是我的 AndroidViewModel 子class:
class QuestsViewModel(application: Application) : AndroidViewModel(application) {
// Some member state variables
}
我正在尝试从我的主 activity 的 onCreate
访问它,如下所示:
val viewModel = ViewModelProviders.of(this,
ViewModelProvider.AndroidViewModelFactory(this.application))
.get(QuestsViewModel::class.java)
但是我得到编译器错误:
Type parameter bound for T in operator fun get(p0: Class): T is not satisfied: inferred type QuestsViewModel! is not a subtype of ViewModel!
我很困惑为什么它认为我的自定义 ViewModel class 不是子 class,当 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
class - 一个来自 androidx 命名空间,一个不。
将我所有的 gradle 包迁移到 androidx 版本(如果可能)并更新所有 import
语句解决了问题。