Compose Multiplatform项目kotlinx-atomicfu与SQLDelight插件冲突构建失败
问题解决:Compose Multiplatform + SQLDelight + kotlinx-atomicfu 插件冲突
问题背景
集成SQLDelight的Compose Multiplatform项目存在以下矛盾:
- 不启用kotlinx-atomicfu插件时,构建直接失败,提示找不到atomicfu相关klib文件
- 启用插件后,与SQLDelight插件冲突,导致iOS端Compose入口代码触发空指针异常
- 项目可直接在模拟器运行,但执行重建操作必失败
- 尝试升级SQLDelight版本,但新版本依赖的Kotlin版本当前Compose Multiplatform暂不支持
错误详情
- 未启用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]
- 启用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
相关产品推荐
相关产品推荐

