首页/新闻资讯/正文详情

Koin 在 Kotlin Multiplatform(KMP)中的完整配置指南:依赖、模块划分与多平台启动

发布时间:2026/9/24 16:02:55 来源:云帆数科 栏目:资讯中心
Koin 在 Kotlin Multiplatform(KMP)中的完整配置指南:依赖、模块划分与多平台启动
后端【免费下载链接】koinKoin - a pragmatic lightweight dependency injection framework for Kotlin Kotlin Multiplatform项目地址https://gitcode.com/gh_mirrors/ko/koin点击查看免费下载Koin 为 Kotlin MultiplatformKMP项目提供了一等公民first-class支持同一份业务代码在 Android、iOS、JVM、JS、Wasm、桌面与服务器端共享依赖注入容器按平台分别初始化。本文以 Koin 官方 KMP 指南docs/reference/koin-core/kmp-setup.md为主体结合仓库中koin-core的源码实现系统讲解build.gradle.kts依赖配置、expect/actual 平台模块、共享初始化函数initKoin()以及 Android/iOS/JVM 三端入口点的完整落地步骤。支持平台一览Koin 的核心库koin-core采用 Kotlin Multiplatform 工程结构见 projects/core/koin-core/src 下的commonMain、androidMain、iosMain、jsMain、jvmMain、nativeMain、wasmJsMain等源码集官方对目标平台的支持情况如下平台状态Android✅ 完整支持iOSarm64、x64、simulatorArm64✅ 完整支持JVM✅ 完整支持JS✅ 完整支持Wasm✅ 完整支持macOS✅ 完整支持Linux✅ 完整支持Windows✅ 完整支持其中KoinPlatformprojects/core/koin-core/src/commonMain/kotlin/org/koin/mp/KoinPlatform.kt正是面向 KMP 暴露的统一基础设施 API提供startKoin(modules, level)、stopKoin()、getKoin()等跨平台入口上层各平台只需针对自己的原生运行时做薄薄一层封装。依赖配置shared/build.gradle.kts在共享模块中应用kotlin(multiplatform)插件并按需声明各平台 target。建议通过Koin BOM统一管理版本避免手工对齐依赖版本plugins { kotlin(multiplatform) id(io.insert-koin.compiler.plugin) // 可选使用 Compiler Plugin DSL 时启用 } kotlin { androidTarget() iosX64() iosArm64() iosSimulatorArm64() jvm() js(IR) { browser() } sourceSets { commonMain.dependencies { implementation(platform(io.insert-koin:koin-bom:4.2.0)) implementation(io.insert-koin:koin-core) } commonTest.dependencies { implementation(io.insert-koin:koin-test) } androidMain.dependencies { implementation(io.insert-koin:koin-android) } } }要点说明koin-bomBOM 会锁定koin-core、koin-test、koin-android、koin-compose等一组坐标的版本声明依赖时无需再写版本号本例版本4.2.0为文档示例可按实际发布版本替换。BOM 模块位于 projects/bom/koin-bom。koin-test放入commonTest意味着单元测试本身可以跨平台共享配合KoinTest接口见 projects/core/koin-test/src/commonMain/kotlin/org/koin/test/KoinTest.kt中的getT()/injectT()扩展即可在 commonTest 中直接解析依赖。koin-android仅放入androidMainAndroid 专属的androidContext()、androidLogger()扩展见 projects/android/koin-android/api/koin-android.api 中的 API 签名只在 Android 源码集中可见避免污染共享代码。Compiler Plugin 插件为可选id(io.insert-koin.compiler.plugin)仅在你使用 Compiler Plugin DSLsingleType()无 lambda 写法时启用详见 docs/setup/compiler-plugin.md。搭配 Compose Multiplatform如果共享层还要提供 UI可在commonMain中追加 Compose 相关依赖kotlin { sourceSets { commonMain.dependencies { implementation(platform(io.insert-koin:koin-bom:4.2.0)) implementation(io.insert-koin:koin-core) implementation(io.insert-koin:koin-compose) implementation(io.insert-koin:koin-compose-viewmodel) } } }koin-compose与koin-compose-viewmodel的 multiplatform 实现分别位于 projects/compose/koin-compose 与 projects/compose/koin-compose-viewmodel可在 Android、iOS、Desktop 等平台共享koinViewModel()等组合函数。仓库的版本目录 projects/gradle/libs.versions.toml 同时维护了 JetBrains Composejb-compose与 AndroidX 生态的版本对齐供参考。项目结构建议官方推荐按“共享模块 各平台宿主应用”组织工程project/ ├── shared/ │ ├── src/ │ │ ├── commonMain/ │ │ │ └── kotlin/ │ │ │ ├── di/ │ │ │ │ └── KoinModules.kt │ │ │ └── domain/ │ │ │ └── UserRepository.kt │ │ ├── androidMain/ │ │ │ └── kotlin/ │ │ │ └── di/ │ │ │ └── PlatformModule.android.kt │ │ └── iosMain/ │ │ └── kotlin/ │ │ └── di/ │ │ └── PlatformModule.ios.kt │ └── build.gradle.kts ├── androidApp/ │ └── src/main/kotlin/ │ └── MainApplication.kt └── iosApp/ └── iOSApp.swift核心思路业务逻辑repository、use case 等全部放在commonMain平台能力文件系统、数据库驱动、网络引擎等通过 expect/actual 下沉到androidMain/iosMain的专属模块中。共享模块定义commonMain 中的 KoinModules.kt在commonMain/kotlin/di/KoinModules.kt中声明共享的 DI 模块并声明一个expect的平台模块占位import org.koin.dsl.module // 共享定义Compiler Plugin DSL 写法 val sharedModule module { singleUserRepository() singleApiClient() factoryGetUserUseCase() } // 平台专属模块按平台分别实现 expect val platformModule: Module官方建议共享模块优先使用Compiler Plugin DSLsingleType()直接引用类型、无 lambda。它需要启用编译器插件但语法最干净也不需要为每个平台单独配置 KSP是跨平台一致性最好的声明方式。关于三种声明方式Compiler Plugin DSL、Annotations、Classic DSL与Single/Factory/ViewModel定义类型的详细说明见 docs/reference/koin-core/definitions.md。平台专属模块expect/actual 实现平台模块可以用任意一种 DSL 方式声明。当需要自定义构造逻辑如传入平台特有的依赖时使用带 lambda 的 Classic DSLandroidMain/kotlin/di/PlatformModule.android.ktimport org.koin.dsl.module actual val platformModule module { // Classic DSL with lambda自定义构造逻辑 singlePlatformHelper { AndroidPlatformHelper(get()) } singleDatabaseDriver { AndroidDatabaseDriver(get()) } }iosMain/kotlin/di/PlatformModule.ios.ktimport org.koin.dsl.module actual val platformModule module { // 若无自定义逻辑也可用 Compiler Plugin DSL / Annotations singleIosPlatformHelper() bind PlatformHelper::class singleIosDatabaseDriver() bind DatabaseDriver::class }两种写法分别展示了“lambda 手动装配”与“bind附加绑定按接口解析实现类”两种模式前者适合构造参数来自平台上下文如get()拉取其他依赖的场景后者适合实现类可直接无参构造、只需暴露为抽象接口的场景。平台模块的 expect/actual 组织方式在 docs/reference/koin-core/kmp-shared-modules.md 中有更完整的展开含 JS 平台的LocalStorageSettings等示例。共享初始化initKoin 统一入口在commonMain/kotlin/di/KoinInit.kt定义一次性的初始化函数把共享模块与平台模块一并装配并通过includes(config)为各平台预留扩展钩子import org.koin.core.context.startKoin import org.koin.core.KoinApplication fun initKoin(config: KoinAppDeclaration? null): KoinApplication { return startKoin { includes(config) modules( sharedModule, platformModule ) } }从源码看startKoin最终会委托给平台相关的默认上下文projects/core/koin-core/src/commonMain/kotlin/org/koin/core/context/DefaultContextExt.kt 中的startKoin(appDeclaration)由KoinPlatformTools.defaultContext()路由到 JVM/Native/JS/Wasm 各自的GlobalContext实现KoinApplicationprojects/core/koin-core/src/commonMain/kotlin/org/koin/core/KoinApplication.kt则负责在启动时统计并加载模块INFO 级别下会打印Started N definitions in ... ms。includes(config)的语义是若平台传入了额外的KoinAppDeclaration配置块则将其内联进本次初始化等价于把平台扩展代码合入同一个 DSL 作用域。各平台入口点KMP 中没有统一的“main”每个平台在自己的入口处调用共享的initKoin()再按需叠加平台扩展。AndroidApplication 中启动在androidApp/src/main/kotlin/MainApplication.kt中利用koin-android提供的androidContext()/androidLogger()扩展class MainApplication : Application() { override fun onCreate() { super.onCreate() initKoin { androidContext(thisMainApplication) androidLogger() } } }androidContext()会把Application的Context注册进 Koin 容器供需要Context的依赖如数据库、SharedPreferences 封装通过get()解析androidLogger()则将日志输出桥接到 Android LogcatAPI 定义见 projects/android/koin-android/api/koin-android.api。iOSSwift 侧调用共享初始化iOS 端需在共享模块的iosMain里暴露一个可被 Swift 调用的无参包装函数// shared/src/iosMain/kotlin/di/KoinInitIos.kt fun initKoinIos() { initKoin() }// iosApp/iOSApp.swift import shared main struct iOSApp: App { init() { KoinInitIosKt.initKoinIos() } var body: some Scene { WindowGroup { ContentView() } } }注意 Swift 侧调用的是 Kotlin 编译器生成的KoinInitIosKt.initKoinIos()文件名KoinInitIos.kt对应类名KoinInitIosKt在App.init()中完成容器初始化确保后续任何视图访问依赖前容器已就绪。JVMmain 函数直接启动JVM桌面或服务器入口最为直接启动后即可通过get()解析依赖fun main() { initKoin { printLogger() } val repository: UserRepository get() }printLogger()使用平台默认的PrintLogger默认日志级别为Level.INFO见 projects/core/koin-core/src/commonMain/kotlin/org/koin/core/KoinApplication.kt 中printLogger(level: Level Level.INFO)的定义。若需要显式配置日志级别、属性或覆盖策略同样可在initKoin { ... }的 DSL 块内追加logger(...)、properties(...)、allowOverride(...)等配置。KMP 中三种 DSL 方式的选择声明方式适用场景Compiler Plugin DSL默认首选——全平台可用语法最干净singleType()无 lambdaAnnotations默认首选——全平台可用无需手写模块代码由注解处理器生成Classic DSL with lambda构建器模式、自定义工厂逻辑、测试替身mock等需要手动装配的场景Compiler Plugin DSL 与 Annotations 在所有支持平台上均可使用只有当你确实需要自定义构造逻辑时才退回到 Classic DSL with lambda。Compiler Plugin 的具体接入步骤见 docs/setup/compiler-plugin.md。最佳实践清单共享代码放进commonMain——业务逻辑、repository、use case 全部共享最大化复用。平台特性使用 expect/actual——文件系统、设备 API、平台库只出现在对应平台源码集。每个平台单独初始化 Koin——各平台拥有自己的入口点通过initKoinincludes(config)模式统一扩展。平台模块保持最小化——只放真正平台相关的内容其余全部留在共享模块。下一步阅读Sharing Patterns模块组织与 expect/actual 模式——共享模块的按层/按功能组织、平台扩展与 ViewModel 共享写法Multiplatform ViewModel——koin-compose-viewmodel的跨平台 ViewModel 支持Advanced Patterns架构模式与平台集成——KMP 项目的高级架构与测试实践TestingKMP 测试——如何在 commonTest 中验证模块与依赖解析赞分享后端【免费下载链接】koinKoin - a pragmatic lightweight dependency injection framework for Kotlin Kotlin Multiplatform项目地址https://gitcode.com/gh_mirrors/ko/koin点击查看免费下载相关推荐Koin 跨平台模块共享模式在 Kotlin Multiplatform 项目中组织与共享依赖注入模块Koin 跨平台模块共享模式在 Kotlin Multiplatform 项目中组织与共享依赖注入模块 导读 在 Kotlin MultiplatformK后端Koin 项目接入指南从依赖配置到多平台启动BOM 与平台 Setup 全解Koin 项目接入指南从依赖配置到多平台启动BOM 与平台 Setup 全解 本文是 Koin 在当前仓库中的官方安装与配置指南覆盖纯 Kotlin、A后端IntelliJ 平台 Pseudo-KMP 模块实战指南借助 expects-compiler-plugin 模拟 Kotlin Multiplatform expect/actualIntelliJ 平台 Pseudo KMP 模块实战指南借助 expects compiler plugin 模拟 Kotlin Multiplatform开发工具IDE代码编辑器上一篇抖音无水印下载神器douyin-downloader 完全使用指南下一篇告别限速烦恼九大网盘直链下载助手完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

douyin-downloader 抖音批量下载教程:三步从零跑通,去水印下载与自动归档
douyin-downloader 抖音批量下载教程:三步从零跑通,去水印下载与自动归档

douyin-downloader 抖音批量下载教程:三步从零跑通,去水印下载与自动归档 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplicatio… · 2026/9/24 16:02:55

protobuf.js 扩展模块实战指南:descriptor / protojson / textformat 的安装、使用与源码剖析
protobuf.js 扩展模块实战指南:descriptor / protojson / textformat 的安装、使用与源码剖析

protobuf.js 扩展模块实战指南:descriptor / protojson / textformat 的安装、使用与源码剖析 【免费下载链接】protobuf.js High-performance Protocol Buffers for JavaScript and TypeScript. Conformant through Edition 2026, and unusually versatile. No pro… · 2026/9/24 16:02:55

RedwoodJS 部署指南:从 Serverless 到 Baremetal 的全目标部署体系解析
RedwoodJS 部署指南:从 Serverless 到 Baremetal 的全目标部署体系解析

后端前端Web框架开发工具 【免费下载链接】redwood RedwoodGraphQL 项目地址: https://gitcode.com/gh_mirrors/re/redwood 点击查看 免费下载 Redwood 框架从设计之初就同时面向 serverless 与传统服务器两类基础设施,并为两者提供了统一的持续部署流程… · 2026/9/24 16:02:42

Chat2DB 完整上手指南:用自然语言写SQL的多数据库客户端
Chat2DB 完整上手指南:用自然语言写SQL的多数据库客户端

Chat2DB 完整上手指南:用自然语言写SQL的多数据库客户端 【免费下载链接】Chat2DB Chat2DB is a free, cross-platform, local-first database client and SQL workspace for developers, DBAs, analysts, and data teams. Connect to 40 databases, manage data, e… · 2026/9/24 16:34:58

JiuwenSymbiosis视觉感知管线深度解析:从开放词汇检测到像素到基座坐标的三维反投影
JiuwenSymbiosis视觉感知管线深度解析:从开放词汇检测到像素到基座坐标的三维反投影

JiuwenSymbiosis视觉感知管线深度解析:从开放词汇检测到像素到基座坐标的三维反投影 【免费下载链接】jiuwensymbiosis Jiuwen Symbiosis就是一个"能懂人话、看得见物理世界、长了四肢的智能助手"。用户不需要示教,不需要教它怎么抓东西&#… · 2026/9/24 16:34:58

@formily/vue 全面解析:响应式表单胶水层的架构设计、协议驱动与三种开发模式
@formily/vue 全面解析:响应式表单胶水层的架构设计、协议驱动与三种开发模式

前端UI组件 【免费下载链接】formily 📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3 项目地址: https://gitcode.com/gh_mirrors… · 2026/9/24 16:34:58

玲珑系列多功能控制器硬件设计详解:数字 IO、模拟采集与组网接线
玲珑系列多功能控制器硬件设计详解:数字 IO、模拟采集与组网接线

拿到一台控制器,软件层面的事情反而不难,真正容易出问题的是硬件集成:DI 接的是源型还是漏型、DO 能不能直接驱动电磁阀、编码器差分线要不要屏蔽、多台设备怎么级联、上电之后指示灯为什么不亮。这篇文章基于 玲珑系列多功能控制器的硬件手册… · 2026/9/24 16:34:51

【Linux】Linux几个面试题
【Linux】Linux几个面试题

1.概述 1) Linux 中主要有哪几种内核锁? Linux 的同步机制从 2.0 到 2.6 以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux 从单处理器到对称多处理器的过渡; 伴随着从非抢占内核到抢占内核的过度。Linux 的锁机… · 2026/9/24 16:34:51

AI用88小时解开90年难题,人类只讨论了14天
AI用88小时解开90年难题,人类只讨论了14天

2026年9月8日,OpenAI 发布声明说,他们的一个内部模型解开了纳维-斯托克斯问题,一道数学界悬了90多年的题。一万多个AI智能体,88小时,165页论文。就在这个声明公布的两分钟前,一位澳大利亚数学家在自己的社交… · 2026/9/24 16:34:18

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码