KMP桌面项目集成Room报错:AppDatabaseConstructor无对应expect声明
KMP桌面项目集成Room编译报错:自动生成的
actual object无对应expected声明 问题详情
在Kotlin Multiplatform桌面项目中集成Room时,编译抛出错误:
AppDatabaseConstructor.kt:5:22 'actual object AppDatabaseConstructor : RoomDatabaseConstructor<BusStopsDatabase>' has no corresponding expected declaration
该错误出现在自动生成的文件中,代码如下:
public actual object AppDatabaseConstructor : RoomDatabaseConstructor<BusStopsDatabase> { actual override fun initialize(): BusStopsDatabase = com.mypackage.`data`.datasource.local.BusStopsDatabase_Impl() }
我的Gradle配置与数据库代码如下:
Gradle配置
plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.composeMultiplatform) alias(libs.plugins.composeCompiler) // Room alias(libs.plugins.androidx.room) alias(libs.plugins.ksp) } kotlin { jvm("desktop") sourceSets { val desktopMain by getting commonMain.dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material) implementation(compose.ui) implementation(compose.components.resources) implementation(compose.components.uiToolingPreview) implementation(libs.androidx.lifecycle.viewmodel) implementation(libs.androidx.lifecycle.runtime.compose) //koin implementation(project.dependencies.platform(libs.koin.bom)) implementation(libs.koin.core) implementation(libs.koin.compose) implementation(libs.koin.compose.viewmodel.navigation) //retrofit implementation("com.squareup.retrofit2:retrofit:2.11.0") implementation("com.squareup.retrofit2:converter-jackson:2.11.0") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.18.2") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.0") //room implementation(libs.androidx.sqlite.bundled) implementation(libs.androidx.room.runtime) } desktopMain.dependencies { implementation(compose.desktop.currentOs) implementation(libs.kotlinx.coroutines.swing) } } } dependencies { add("kspDesktop", libs.androidx.room.compiler) } room { schemaDirectory("$projectDir/schemas") } compose.desktop { application { mainClass = "com.package.MainKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "com.package" packageVersion = "1.0.0" } } }
数据库构造代码
@Database(entities = [BusStopEntity::class], version = 1) @ConstructedBy(AppDatabaseConstructor::class) abstract class BusStopsDatabase : RoomDatabase() { abstract fun busStopDao(): BusStopsDao } // The Room compiler generates the `actual` implementations. @Suppress("NO_ACTUAL_FOR_EXPECT") expect object AppDatabaseConstructor : RoomDatabaseConstructor<BusStopsDatabase> { override fun initialize(): BusStopsDatabase }
解决办法
对齐包名
自动生成的actual类包路径是com.mypackage.data.datasource.local,你手动编写的expect object AppDatabaseConstructor必须放在完全一致的包路径下。包名不匹配的话,Kotlin无法识别对应的预期声明,直接触发报错。
调整KSP配置范围
当前仅给desktop目标配置了KSP依赖,但Room编译器需要处理commonMain中的数据库注解。修改Gradle配置,给commonMain也添加KSP支持:
kotlin { jvm("desktop") sourceSets { val desktopMain by getting val commonMain by getting // 新增KSP的common sourceSet val kspCommonMain by creating { dependsOn(commonMain) } commonMain.dependsOn(kspCommonMain) } } dependencies { add("kspCommonMain", libs.androidx.room.compiler) add("kspDesktop", libs.androidx.room.compiler) }
移除掩盖问题的注解并检查Room版本
删掉@Suppress("NO_ACTUAL_FOR_EXPECT"),这个注解会隐藏真实的匹配问题。同时确认你的Room版本(在libs.versions.toml中)至少为2.6.0,旧版本对KMP桌面的支持存在兼容性bug。
清理缓存后重新构建
先执行./gradlew clean清理旧构建缓存,再同步Gradle,最后重新编译项目。缓存中的旧代码有时会导致这类奇怪的匹配错误。
检查@ConstructedBy引用正确性
确保@ConstructedBy(AppDatabaseConstructor::class)中的类引用与你编写的expect对象全限定名完全一致,避免拼写或包名错误。
内容的提问来源于stack exchange,提问作者NullPointerException
相关产品推荐
相关产品推荐

