KMP项目引入Koin Compose ViewModel依赖后iOS编译失败,请求确认Koin部署是否正确并解决问题
看起来你遇到的问题是Koin Compose ViewModel的依赖在iOS平台引入了Android专属的SavedState库,导致iOS编译时找不到这个仅Android可用的依赖,所以才会报Could not find "org.jetbrains.androidx.savedstate:savedstate"的错误。先帮你梳理下Koin的部署问题,再给出具体修复方案:
一、先确认你的Koin依赖配置问题
你的commonMain里直接引入了libs.koin.compose.viewmodel,但这个依赖是带有Android Jetpack ViewModel SavedState特性的,它依赖Android专属的savedstate库,而iOS平台根本不需要也找不到这个库,所以才会在iOS编译流程中失败。Koin的跨平台ViewModel依赖应该区分平台配置,而不是直接在common模块引入Android专属的依赖。
二、具体修复步骤
1. 拆分Koin依赖的平台配置
把commonMain里的libs.koin.compose.viewmodel移到androidMain中,同时在commonMain使用Koin的跨平台ViewModel核心依赖,替换掉原来的Android专属依赖:
- 在
commonMain.dependencies中保留跨平台通用的Koin依赖:
implementation(libs.koin.core) implementation(libs.koin.compose) // 替换原viewmodel依赖为跨平台核心版本 implementation(libs.koin.compose.viewmodel.core) // 若libs.toml无此依赖,可直接用坐标:io.insert-koin:koin-compose-viewmodel-core:$koin_version
- 在
androidMain.dependencies中添加Android专属的Koin ViewModel依赖:
implementation(libs.koin.androidx.compose) implementation(libs.koin.compose.viewmodel) // 把原来common里的这个依赖移到这里
2. 检查libs.toml中的Koin版本配置
确保你的Koin依赖是支持跨平台的3.5+版本(这个版本对KMP的适配更完善),示例libs.toml配置如下:
[versions] koin = "3.5.6" [libraries] koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } koin-compose = { module = "io.insert-koin:koin-compose", version.ref = "koin" } koin-compose-viewmodel-core = { module = "io.insert-koin:koin-compose-viewmodel-core", version.ref = "koin" } koin-androidx-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koin" } koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" }
3. 清理缓存重新编译
做完依赖调整后,执行以下操作确保缓存清理干净:
- 执行Gradle的
clean任务 - 进入iOS项目目录,执行
pod deintegrate && pod install清理Pods缓存 - 重新在Xcode中打开
iosApp.xcworkspace编译
三、问题根源说明
koin-compose-viewmodel这个依赖默认会引入Android的SavedStateHandle相关库,这是Android Jetpack ViewModel的专属特性,Kotlin Multiplatform的iOS平台完全不需要这个依赖。当你在commonMain中引入它时,Gradle会尝试在iOS平台也解析这个Android专属库,最终导致找不到依赖的编译错误。
通过拆分依赖到对应平台,就能让Android使用带SavedState的ViewModel,iOS使用Koin的跨平台ViewModel核心实现,完美规避不必要的Android依赖侵入iOS编译流程。
内容来源于stack exchange

