KMM项目使用PopKorn依赖注入iOS端无法识别@Injectable注解如何解决
KMM项目PopKorn依赖注入iOS端失效解决方案
- kapt仅支持JVM/Android平台,无法在Kotlin/Native(iOS编译链)中运行,你当前仅配置了全局kapt依赖,只有Android编译时会触发注解处理器生成Provider类,iOS构建时完全没有运行注解处理流程,因此找不到对应类的Provider。
1. 项目添加KSP插件支持
KSP(Kotlin Symbol Processing)是Kotlin官方推出的注解处理工具,支持全KMP平台,替代kapt实现跨平台注解处理。
在项目根目录build.gradle.kts中添加KSP插件依赖,版本需与你项目使用的Kotlin版本严格一致:
plugins { id("com.android.application") version "你的AGP版本" apply false id("org.jetbrains.kotlin.android") version "你的Kotlin版本" apply false id("org.jetbrains.kotlin.multiplatform") version "你的Kotlin版本" apply false // 新增KSP插件,版本和Kotlin版本完全匹配 id("com.google.devtools.ksp") version "你的Kotlin版本" apply false }
2. 修改shared模块构建配置
修改shared/build.gradle.kts:
plugins { id("com.android.library") id("org.jetbrains.kotlin.multiplatform") // 引入KSP插件 id("com.google.devtools.ksp") } kotlin { // 你的原有目标配置 android() iosX64() iosArm64() iosSimulatorArm64() ios { binaries.framework { baseName = "shared" // 导出popkorn依赖,iOS端才能访问框架内的注解生成类 export("cc.popkorn:popkorn:2.1.1") } } sourceSets { val commonMain by getting { dependencies { // 把implementation改成api,配合export使用 api("cc.popkorn:popkorn:2.1.1") } } // 其余原有配置不变 } } // 删除原有全局kapt配置,替换为多平台KSP配置 dependencies { // Android端注解处理器 add("kspAndroid", "cc.popkorn:popkorn-compiler:2.1.1") // iOS各目标平台注解处理器,根据你的项目支持的iOS目标添加 add("kspIosX64", "cc.popkorn:popkorn-compiler:2.1.1") add("kspIosArm64", "cc.popkorn:popkorn-compiler:2.1.1") add("kspIosSimulatorArm64", "cc.popkorn:popkorn-compiler:2.1.1") }
注:修改后
androidApp/build.gradle.kts里的popkorn依赖可以删除,因为shared模块已经通过api导出了该依赖,Android端可以直接使用。
3. 修正Bridge方法命名避免关键字冲突
Kotlin的init属于关键字,导出到ObjC/Swift时可能出现命名异常,修改iosMain/Bridge.kt的方法名:
// 原来的init改成initPopkorn fun initPopkorn(creator: (ObjCClass) -> Mapping) = cc.popkorn.setup(creator) fun getInjector() = InjectorObjC(popKorn())
对应的iOS初始化代码同步修改:
@main struct iOSApp: App { init() { // 改成调用initPopkorn BridgeKt.initPopkorn { (clazz) -> PopkornMapping in return clazz.alloc() as! PopkornMapping } } // 其余原有代码不变 }
4. 清理缓存重新构建
执行以下命令清理旧构建产物后重新运行iOS构建:
./gradlew clean
重新构建时即可看到KSP处理PopKorn注解的日志,生成的Provider类会自动包含到iOS的Framework中,报错即可解决。
内容的提问来源于stack exchange,提问作者Georgi
相关产品推荐
相关产品推荐

