用途
本技能面向使用 Kotlin Multiplatform(KMP)与 Compose Multiplatform(CMP)构建跨平台应用的场景,目标是在 Android、iOS、桌面和 Web 之间共享业务逻辑,并可选地共享 UI。
主要能力
- 共享业务逻辑与可选共享 UI,覆盖 Android、iOS、桌面、Web。
- 通过 expect/actual 模式声明平台相关实现。
- 使用 Ktor 进行跨平台 HTTP 网络请求。
- 使用 SQLDelight 实现跨平台本地数据库存储。
- 使用 Compose Multiplatform 编写共享 UI。
- 与 iOS 集成,包括 Swift 互操作以及 CocoaPods 或 SPM 集成。
- 在 commonTest 中编写可在所有目标平台运行的共享测试。
项目结构
资料给出的典型结构包含:composeApp(共享 Compose UI,含 commonMain、androidMain、iosMain、desktopMain)、shared(共享业务逻辑,含 commonMain 下的 data/domain/platform 目录、androidMain、iosMain、commonTest)、androidApp、iosApp(Xcode 工程)、build.gradle.kts、settings.gradle.kts。
使用方式
expect/actual 模式
在 commonMain 中声明 expect class PlatformContext、expect fun getPlatformName()、expect fun createHttpClient();在 androidMain 与 iosMain 中分别提供 actual 实现。Android 侧使用 OkHttp 引擎,iOS 侧使用 Darwin 引擎,并安装 ContentNegotiation 与 json。
关键库
资料列出的库包括:Ktor(HTTP 客户端)、kotlinx.serialization(JSON 解析)、kotlinx.coroutines(异步/并发)、SQLDelight(本地数据库)、Koin(依赖注入)、Compose Multiplatform(共享 UI)、kotlinx.datetime(日期/时间)、Napier(日志),均标注为支持多平台。
网络请求(Ktor)
在 commonMain 中定义 ApiClient,封装 httpClient.get 与 httpClient.post,配合 @Serializable 数据类(如 User)使用。
本地存储(SQLDelight)
在 src/commonMain/sqldelight 下编写 .sq 文件,定义建表语句与 selectAll、insertOrReplace、deleteById 等查询。
Compose Multiplatform UI
在 commonMain 中编写共享 @Composable,例如 UserListScreen,使用 collectAsState 收集状态,配合 Scaffold、TopAppBar、LazyColumn 等组件。
iOS 集成
Swift 侧可 import shared 并调用共享 Kotlin 代码(如 UserListViewModel 与 Flow 收集)。build.gradle.kts 中配置 iosX64、iosArm64、iosSimulatorArm64,并可通过 cocoapods 块设置 summary、homepage、ios.deploymentTarget 与 framework baseName。
测试
在 commonTest 中编写测试,例如 UserRepositoryTest,使用 runTest 与断言验证共享逻辑。
适用场景
需要为 Android、iOS、桌面或 Web 构建跨平台 Kotlin 应用,并希望复用网络、存储、模型等业务逻辑时适用;当原生外观不是关键需求时,可使用 Compose Multiplatform 共享 UI。
限制与最佳实践
资料建议:共享业务逻辑(网络、存储、模型),必要时保留平台原生 UI;谨慎使用 expect/actual,优先通过依赖注入使用接口加平台实现;保持共享模块精简,避免引入平台相关重型依赖;在 commonTest 中测试共享代码;新项目在原生外观不关键时使用 Compose Multiplatform。
相关资源
资料提及 android-development、ios-development 技能以及 agent-flutter-developer 技能作为相关或替代方案。
暂未提供
关于收费、价格、平台支持范围、实际效果等具体信息,资料中暂未提供。