KMM结合Compose Multiplatform重建项目时触发空指针异常求助
KMM项目iOS模块重建时触发Compose编译器空指针异常(添加SQLDelight后出现)
问题详情
- 开发环境:Android Studio Hedgehog | 2023.1.1 Patch 2
- 触发场景:重建KMM项目时,iOS模块抛出空指针异常
- 异常栈关键信息:
java.lang.NullPointerException at androidx.compose.compiler.plugins.kotlin.k1.AnnotationUtilsKt$makeComposableAnnotation$1.getType(AnnotationUtils.kt:38) at org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getAnnotationClass(DescriptorUtils.kt:402) ...
- 受影响文件:iOS端
MyApp.kt(代码见下文) - 当前依赖版本:
compose = "1.6.2" compose-plugin = "1.6.0" kotlin = "1.9.22" sqldelight = "2.0.1" coroutines = "1.8.1-Beta"
- 核心症状:Android端可正常启动,iOS模块重建时触发异常导致无法同步代码变更;异常在添加SQLDelight依赖后出现,尝试过调整Coroutines版本、重新构建、依赖版本微调均未解决。
受影响代码(iOS端MyApp.kt)
package com.radekstuj.myapp.presentation import androidx.compose.runtime.Composable import androidx.compose.ui.window.ComposeUIViewController import com.radekstuj.myapp.data.model.DriverFactory import com.radekstuj.myapp.presentation.AppViewModel import com.radekstuj.myapp.presentation.MyApp import platform.UIKit.UIViewController fun MainViewController(): UIViewController { val driver = DriverFactory().createDriver() val viewModel = AppViewModel(driver) return ComposeUIViewController { MyApp(viewModel) } }
修复方案尝试
1. 对齐Compose库与插件版本
当前Compose库版本1.6.2,但编译器插件用的是1.6.0,版本不匹配可能引发注解解析冲突。将插件版本升级至与库版本一致:
compose-plugin = "1.6.2"
2. 调整SQLDelight与Kotlin版本兼容性
SQLDelight 2.0.1官方推荐搭配Kotlin 1.9.20,当前使用的Kotlin 1.9.22可能存在兼容性问题:
- 方案一:将Kotlin版本降级至1.9.20
- 方案二:升级SQLDelight至兼容Kotlin 1.9.22的版本(如2.0.2)
3. 检查iOS模块Compose依赖完整性
确保iOS模块的build.gradle.kts中正确引入Compose核心依赖,避免编译器无法解析@Composable注解:
compose.ui() compose.foundation() compose.material3() // 或项目使用的Material版本
4. 彻底清理缓存后重建
- 执行
File → Invalidate Caches...,勾选"Invalidate and Restart"重启Android Studio - 删除项目根目录下的
.gradle、build文件夹,以及iOS模块的build文件夹 - 重新打开项目并执行Gradle同步
5. 排查DriverFactory跨端实现
确认DriverFactory的iOS端实现未引入Android专属注解或依赖,避免编译器处理iOS代码时出现注解解析错误。
内容的提问来源于stack exchange,提问作者Radek Stůj
相关产品推荐
相关产品推荐

