You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kotlin Multiplatform + Compose Multiplatform项目中全局启用ExperimentalMaterial3Api的正确方式

Kotlin Multiplatform + Compose Multiplatform项目中全局启用ExperimentalMaterial3Api的正确方式

嘿,我完全懂你现在碰到的麻烦——在KMM+CMP项目里想全局开启ExperimentalMaterial3Api的opt-in,结果每个平台都报注解找不到的错误,太闹心了。我来帮你捋清楚正确的配置方式,还有可能踩的坑。

先排查核心问题:重复的Material3依赖

看你的build.gradle.kts配置,commonMain的依赖里同时加了implementation(compose.material3)implementation(libs.material3),这大概率是问题根源!

  • compose.material3是Compose Multiplatform专用的Material3库,包含了跨平台可用的ExperimentalMaterial3Api注解;
  • libs.material3如果指向的是Android原生的com.google.android.material:material库,那这个依赖只在Android平台有效,非Android平台(比如iOS)根本找不到这个库,自然会报注解未识别的错误。

第一步:清理重复依赖
commonMain.dependencies里的implementation(libs.material3)删掉,只保留implementation(compose.material3)就够了。修改后的依赖块示例:

commonMain.dependencies {
    implementation(libs.compottie)
    implementation(compose.runtime)
    implementation(compose.foundation)
    implementation(compose.material3) // 仅保留Compose Multiplatform的Material3库
    implementation(libs.adaptive)
    implementation(compose.materialIconsExtended)
    implementation(compose.ui)
    implementation(libs.kotlinx.serialization.json)
    implementation(libs.navigation.compose)
    implementation(compose.components.resources)
    implementation(compose.components.uiToolingPreview)
    implementation(libs.androidx.lifecycle.viewmodel)
    implementation(libs.androidx.lifecycle.runtimeCompose)
    implementation(project.dependencies.platform(libs.koin.bom))
    implementation(libs.koin.core)
    implementation(libs.koin.compose)
    implementation(libs.koin.compose.viewmodel)
    implementation(libs.koin.compose.viewmodel.navigation)
    api(libs.kotlinx.coroutines.core)
}

两种全局Opt-In的正确配置方式

解决依赖问题后,再配置全局的opt-in,有两种靠谱的方式:

方式一:通过SourceSets全局配置(和你之前的思路一致,确保在kotlin块内)

kotlin代码块中,针对所有sourceSet统一配置opt-in:

kotlin {
    applyDefaultHierarchyTemplate()
    // ... 你的Android、iOS平台配置
    
    // 全局启用ExperimentalMaterial3Api
    sourceSets.all {
        languageSettings.optIn("androidx.compose.material3.ExperimentalMaterial3Api")
    }

    // ... 你的sourceSets依赖配置
}

方式二:使用Compose插件的Experimental扩展(更简洁,推荐)

Compose Multiplatform插件提供了专门的扩展来配置实验性API的opt-in,写法更清爽:

kotlin {
    applyDefaultHierarchyTemplate()
    // ... 你的平台配置
    
    // 全局启用Material3的实验性API
    compose.experimental {
        optIn("androidx.compose.material3.ExperimentalMaterial3Api")
    }

    // ... 你的sourceSets依赖配置
}

最后验证平台配置

  • 对于Android平台:确保androidMain里的Compose依赖(比如compose.preview)都正确引入,编译选项也没问题;
  • 对于iOS平台:你的framework配置isStatic = true是正确的,确保commonMain的依赖能被打包到静态framework中。

按照上面的步骤调整后,各个平台应该就不会再报注解未识别的错误,全局生效ExperimentalMaterial3Api的opt-in了。

内容来源于stack exchange

火山引擎 最新活动