KMP项目中Room 2.7.0-alpha06的RoomDatabaseConstructor声明冲突问题
KMP集成Room 2.7.0-alpha06构造器冲突问题解决
问题根源
Room 2.7.0-alpha06开始会自动生成实现RoomDatabaseConstructor的类,如果你手动定义了同名的expect/actual构造器对象,就会和自动生成的类产生命名冲突,触发“无对应expected声明”“重复声明”这类编译错误。
解决步骤
1. 删除手动定义的expect/actual构造器
直接删掉commonMain中的expect object MyDatabaseCtor,以及androidMain、iosMain目录下对应的actual object实现,消除命名冲突的源头。
2. 配置Room自动生成构造器(可选,自定义类名)
如果需要指定生成的构造器类名,在common模块的build.gradle.kts中添加Room配置:
room { schemaDirectory.set(file("schemas")) // 显式开启自动生成构造器(默认已开启,可按需声明) generateRoomDatabaseConstructor.set(true) // 指定生成的构造器全类名,避免默认名称与其他代码冲突 roomDatabaseConstructorClassName.set("com.your.package.YourGeneratedDatabaseCtor") }
3. 在Database类中关联自动生成的构造器
修改你的RoomDatabase子类,在@Database注解中指定构造器类:
@Database( entities = [YourEntity::class], version = 1, constructor = YourGeneratedDatabaseCtor::class // 填入自动生成的构造器类名 ) abstract class AppDatabase : RoomDatabase() { abstract fun yourDao(): YourDao }
4. 彻底清理构建缓存
- 执行Android Studio的
File > Invalidate Caches... > Invalidate and Restart - 删除项目根目录下的
.gradle文件夹和各模块的build文件夹 - 终端执行
./gradlew clean build重新构建项目
内容的提问来源于stack exchange,提问作者Aris Guimerá
相关产品推荐
相关产品推荐

