KMM中@NativeCoroutine引发iOS构建失败,Opt-in问题待解决
解决KMP-NativeCoroutines插件iOS构建的Opt-in错误问题
问题原因
你使用的1.0.0-ALPHA-5版本KMP-NativeCoroutines插件生成的iOS绑定代码依赖了Kotlin的ExperimentalObjCName实验特性,该特性需要显式Opt-in才能使用。之前错误使用了ExperimentalObjCRefinement注解,导致无法解决问题。
解决方案
方案1:全局模块级Opt-in(推荐)
在KMM模块的build.gradle.kts(或build.gradle)中添加全局编译参数,一次性为所有代码启用该特性,无需在每个注解处单独添加:
Kotlin DSL(build.gradle.kts)写法
kotlin { // 仅为Native目标添加Opt-in参数 targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> { compilations.all { kotlinOptions { freeCompilerArgs += "-opt-in=kotlin.experimental.ExperimentalObjCName" } } } // 或为所有目标(含Android)全局配置,更简便 compilerOptions { freeCompilerArgs.add("-opt-in=kotlin.experimental.ExperimentalObjCName") } }
Groovy DSL(build.gradle)写法
kotlin { targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget) { compilations.all { kotlinOptions { freeCompilerArgs += "-opt-in=kotlin.experimental.ExperimentalObjCName" } } } // 或全局配置 compilerOptions { freeCompilerArgs.add("-opt-in=kotlin.experimental.ExperimentalObjCName") } }
方案2:代码局部Opt-in
如果不想全局启用,可在需要的类或属性上添加正确的Opt-in注解:
- 先导入必要注解:
import kotlin.OptIn import kotlin.experimental.ExperimentalObjCName
- 在属性或类上配置:
// 单个属性单独添加 @OptIn(ExperimentalObjCName::class) @NativeCoroutinesState val flow: StateFlow<Long> = MutableStateFlow(5) // 或在类级别添加,类内所有使用插件注解的元素自动生效 @OptIn(ExperimentalObjCName::class) class NetworkService { @NativeCoroutinesState val flow: StateFlow<Long> = MutableStateFlow(5) }
额外检查点
- 确认插件应用正确:确保在根
build.gradle中添加了插件依赖,并在common模块中应用了该插件。 - 版本兼容性:
1.0.0-ALPHA-5版本的插件建议搭配Kotlin 1.8.x版本使用,若Kotlin版本过低可能引发额外兼容性问题,可尝试同步插件与Kotlin版本。
内容的提问来源于stack exchange,提问作者Andrew Kolubov
相关产品推荐
相关产品推荐

