使用by viewModels时报接收者类型不匹配、导入提示未使用的技术求助
报错根因定位
- 依赖版本重复冲突:build.gradle中同时声明了
androidx.activity:activity-ktx:1.1.0和androidx.activity:activity-ktx:1.2.0-rc01两个不同版本的同一依赖,Gradle解析时可能命中低版本,导致viewModels()扩展函数的接收者(Receiver)类型匹配规则失效,直接抛出类型不匹配报错。 - 废弃老依赖干扰:项目中引入了早已停止维护的
android.arch.lifecycle:extensions:1.1.1,该依赖会拉取旧版Lifecycle库,和当前项目的AndroidX Lifecycle版本产生版本冲突,打乱正确的类加载路径,导致手动导入androidx.activity.viewModels时被IDE判定为未使用。 - 扩展函数匹配规则限制:
by viewModels()的Activity侧扩展函数,要求宿主Activity的父类链路对应androidx.activity.ComponentActivity版本≥1.2.0稳定版,当前混用RC版本+低正式版的配置,无法满足扩展函数的接收者类型校验规则,哪怕类路径存在也会触发类型不匹配错误。
分步解决操作
- 清理重复冲突依赖:删除build.gradle中所有重复声明的activity-ktx条目,替换为单一稳定正式版依赖:
移除以下重复依赖行:
新增统一稳定依赖:implementation "androidx.activity:activity-ktx:1.1.0" implementation "androidx.activity:activity-ktx:1.2.0-rc01"implementation "androidx.activity:activity-ktx:1.2.4" - 移除废弃旧依赖:直接删除已停止维护的旧arch lifecycle依赖行:
implementation "android.arch.lifecycle:extensions:1.1.1" - 重建项目依赖:执行一次
Clean Project->Rebuild Project操作,重新同步Gradle依赖,待同步完成后,重新导入扩展函数类:
原代码中import androidx.activity.viewModelsprivate val viewModel: StripeIntentViewModel by viewModels()即可正常通过校验,IDE也不会再提示导入未使用。 - 兜底强制版本约束:如果同步后发现有其他三方依赖将activity版本降级到1.2.0以下,可在app模块build.gradle的android块下方添加依赖强制规则,锁定版本避免冲突:
configurations.all { resolutionStrategy.force 'androidx.activity:activity-ktx:1.2.4' }
内容的提问来源于stack exchange,提问作者user443654
相关产品推荐
相关产品推荐

