升级Kotlin至1.8后,KMM项目iOS代码报'Kotlin Not Configured'警告如何解决?
问题描述
我正在开发一个包含Android和iOS实现的Kotlin Multiplatform项目,使用Gradle Kotlin DSL构建。将Kotlin从1.6版本升级至1.8版本后,IntelliJ在库的iOS部分所有Kotlin文件上方显示黄色警告Kotlin not configured,且受影响文件无法使用代码补全功能。
我的build.gradle.kts代码如下:
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFramework plugins { kotlin("multiplatform") version "1.8.10" id("com.android.library") } kotlin { android() val xcf = XCFramework() listOf(iosSimulatorArm64(), iosX64(), iosArm64("ios")).forEach { it.binaries.framework { baseName = "SharedLibrary" xcf.add(this) } } sourceSets { val commonMain by getting val androidMain by getting val iosMain by getting val iosSimulatorArm64Main by getting iosSimulatorArm64Main.dependsOn(iosMain) val iosX64Main by getting iosX64Main.dependsOn(iosMain) } } android { namespace = "com.example" compileSdk = 32 defaultConfig { minSdk = 27 targetSdk = 32 } }
解决方法
同步并清理IDE缓存
点击IntelliJ右上角的「Sync Project with Gradle Files」按钮完成同步,然后执行File -> Invalidate Caches... -> Invalidate and Restart,清理缓存并重启IDE,多数配置类异常能通过此步骤解决。调整iOS源集配置逻辑
Kotlin 1.8对KMP源集关联逻辑做了优化,原手动关联的方式可能不再适配新插件规则。可以统一管理iOS源集:sourceSets { val commonMain by getting val androidMain by getting val iosMain by creating { dependsOn(commonMain) } val iosSimulatorArm64Main by getting { dependsOn(iosMain) } val iosX64Main by getting { dependsOn(iosMain) } val iosArm64Main by getting { dependsOn(iosMain) } }或者用
ios()函数统一声明目标,简化配置:kotlin { android() val xcf = XCFramework() ios { binaries.framework { baseName = "SharedLibrary" xcf.add(this) } } iosSimulatorArm64() iosX64() sourceSets { val commonMain by getting val androidMain by getting val iosMain by getting { dependsOn(commonMain) } val iosSimulatorArm64Main by getting { dependsOn(iosMain) } val iosX64Main by getting { dependsOn(iosMain) } } }对齐Kotlin插件与IDE版本
打开Settings -> Plugins -> Kotlin,确保IntelliJ的Kotlin插件版本和项目使用的1.8.10完全一致,版本不匹配是配置识别异常的常见原因。修正XCFramework目标声明
Kotlin 1.8中无需给iosArm64指定"ios"名称,插件会自动识别目标类型,简化配置:kotlin { android() val xcf = XCFramework() listOf(iosSimulatorArm64(), iosX64(), iosArm64()).forEach { target -> target.binaries.framework { baseName = "SharedLibrary" xcf.add(this) } } }
内容的提问来源于stack exchange,提问作者jxddk
相关产品推荐
相关产品推荐

