升级Kotlin 1.7.0后Room报绑定变量无匹配方法参数错误
问题根因
这不是业务代码编写错误,属于版本兼容问题:Kotlin 1.7.0调整了编译阶段生成的方法参数元数据规则,你当前使用的Room 2.4.2版本的kapt处理器没有适配该规则,无法自动读取到DAO方法的参数名,因此判定查询语句中的:limit、:offset绑定变量没有匹配的方法参数。
降级到Kotlin 1.6.21时,参数元数据生成规则和Room 2.4.2的读取逻辑匹配,所以可以正常运行。
修复方案
任选一种即可解决问题:
- 优先选择升级Room依赖到2.4.3或更高版本,该版本已经完成Kotlin 1.7.0的适配,不需要修改任何业务代码,直接调整依赖版本即可正常编译:
implementation "androidx.room:room-runtime:2.4.3" kapt "androidx.room:room-compiler:2.4.3" - 如果暂时不能升级Room版本,可以给DAO方法的参数显式添加
@Param注解指定绑定的参数名,绕开编译时自动读取参数名的逻辑,修改后的代码如下:@Query("SELECT * FROM eventdata ORDER BY id ASC LIMIT :limit OFFSET :offset") fun allEvents( @Param("limit") limit: Int, @Param("offset") offset: Int ): List<EventData>
另外需要注意,你配置里的kotlin-android-extensions插件在Kotlin 1.7及以上版本已经被正式废弃,后续建议尽早迁移到视图绑定、独立Parcelize插件等官方推荐方案,避免后续版本升级出现其他兼容问题。
内容的提问来源于stack exchange,提问作者modsfabio
相关产品推荐
相关产品推荐

