You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:08:10