升级Kotlin Gradle插件至1.6.0后,Room协程中使用suspend关键字报错的解决方案咨询
解决Kotlin Gradle插件1.6.0升级后Room Suspend方法报错问题
我之前升级Kotlin到1.6.x版本时也碰到过一模一样的问题!这个报错的核心原因是旧版本的Room没有适配Kotlin 1.6.x对协程的新处理逻辑,导致Room的注解处理器无法正确解析suspend方法的返回类型,最终生成的代码把返回值识别成了java.lang.Object,违反了Room对DELETE方法的返回类型要求。
下面是具体的解决步骤:
1. 升级Room依赖到兼容Kotlin 1.6.x的版本
Room从2.4.0版本开始正式支持Kotlin 1.6.x,所以你需要把所有Room相关的依赖(runtime、compiler、ktx)都升级到2.4.0或更高的稳定版本,且确保版本号一致。
修改你的build.gradle(Module级)中的Room依赖:
def room_version = "2.4.0" // 也可以用更高的稳定版,比如2.5.0 implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" implementation "androidx.room:room-ktx:$room_version"
如果你使用的是KSP(Kotlin Symbol Processing)替代kapt,也要确保KSP版本和你的Kotlin Gradle插件版本匹配(比如Kotlin 1.6.0对应KSP 1.6.0-1.0.2)。
2. 清理并重建项目
注解处理器生成的旧代码可能会残留,导致缓存冲突。执行以下操作彻底清理:
- 在Android Studio中点击
Build > Clean Project - 然后点击
Build > Rebuild Project - 或者在终端运行命令:
./gradlew clean build
3. 验证Dao方法的返回类型
确保你的Dao中suspend方法的返回类型符合Room要求:
- DELETE方法可以返回
void或者Int(表示删除的行数) - 比如你的
deleteEvento方法可以写成:
@Query("DELETE FROM evento WHERE id = :id") suspend fun deleteEvento(id: Long): Int
或者如果不需要返回行数:
@Query("DELETE FROM evento WHERE id = :id") suspend fun deleteEvento(id: Long)
完成以上步骤后,Room就能正确识别suspend方法的返回类型,报错应该就会消失了。
内容的提问来源于stack exchange,提问作者Ecantu
相关产品推荐
相关产品推荐

