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

Compose Multiplatform项目kotlinx-atomicfu与SQLDelight插件冲突构建失败

问题解决:Compose Multiplatform + SQLDelight + kotlinx-atomicfu 插件冲突

问题背景

集成SQLDelight的Compose Multiplatform项目存在以下矛盾:

  • 不启用kotlinx-atomicfu插件时,构建直接失败,提示找不到atomicfu相关klib文件
  • 启用插件后,与SQLDelight插件冲突,导致iOS端Compose入口代码触发空指针异常
  • 项目可直接在模拟器运行,但执行重建操作必失败
  • 尝试升级SQLDelight版本,但新版本依赖的Kotlin版本当前Compose Multiplatform暂不支持

错误详情

  1. 未启用atomicfu插件时的构建错误:
e: java.lang.IllegalStateException: e: Could not find "../shared/build/kotlinTransformedMetadataLibraries/commonMain/org.jetbrains.kotlinx-atomicfu-0.17.3-nativeInterop-8G5yng.klib" in [/Users/<user>/Library/Application Support/kotlin/daemon] 
  1. 启用atomicfu插件后,iOS端MainViewController.kt的报错:
ERROR: Exception while analyzing expression in (6,5) in ../shared/src/iosMain/kotlin/com/user/kmmtutorial/MainViewController.kt
Attachments:
causeThrowable
java.lang.NullPointerException
    at androidx.compose.compiler.plugins.kotlin.ComposeFqNamesKt$makeComposableAnnotation$1.getType(ComposeFqNames.kt:148)
(...)

可行解决思路

1. 缩小kotlinx-atomicfu插件的应用范围

避免全局应用插件,仅在需要的源集启用,减少与SQLDelight的冲突:

  • 顶层build.gradle.kts保留classpath依赖:
buildscript {
    dependencies {
        classpath("org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.17.3")
    }
}
  • 在shared模块的build.gradle.kts中仅针对common源集启用插件:
plugins {
    kotlin("multiplatform")
    id("com.android.library")
    id("org.jetbrains.compose")
    id("com.squareup.sqldelight")
    id("kotlinx-atomicfu") apply false
}

kotlin {
    // 其他平台配置...

    sourceSets {
        val commonMain by getting {
            apply(plugin = "kotlinx-atomicfu")
            // 依赖配置...
        }
    }
}

2. 选用与当前Kotlin版本兼容的SQLDelight稳定版

根据Compose Multiplatform支持的Kotlin版本,匹配对应SQLDelight版本:

  • 例如使用Kotlin 1.9.x时,可尝试SQLDelight 2.0.0(需确认版本兼容关系)
  • 在shared模块中锁定版本:
sqldelight {
    database("AppDatabase") {
        packageName = "com.user.kmmtutorial.db"
    }
}

dependencies {
    implementation("com.squareup.sqldelight:runtime:2.0.0")
    androidImplementation("com.squareup.sqldelight:android-driver:2.0.0")
    iosMainImplementation("com.squareup.sqldelight:native-driver:2.0.0")
}

3. 禁用atomicfu的元数据转换(针对Native端)

在gradle.properties中添加配置,避免atomicfu对Native元数据的处理与SQLDelight冲突:

kotlinx.atomicfu.transform.metadata=false

临时规避方案

若上述方法均无效,可在重建时临时注释SQLDelight插件,构建完成后再恢复:

plugins {
    kotlin("multiplatform")
    id("com.android.library")
    id("org.jetbrains.compose")
    // id("com.squareup.sqldelight") // 重建时注释,运行前恢复
}

内容的提问来源于stack exchange,提问作者nghtm253

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:15:13