Skip to content

工业级生态与三方库

源:Kotlin Multiplatform 官方文档

在真实开发中,我们不需要(也不应该)从头造轮子。KMP 已经拥有了成熟的生态系统,支持构建完整的网络、数据库和架构层。

核心三剑客:Ktor + SQLDelight + Koin

这三者构成了 KMP 生产环境的“标准套件”。

1. 网络层:Ktor

Ktor 的强大之处在于它在不同平台自动选择最佳的引擎(Android 用 OkHttp,iOS 用 Darwin)。

kotlin
// commonMain
val client = HttpClient {
    install(ContentNegotiation) {
        json(Json { ignoreUnknownKeys = true })
    }
    // 自动适配引擎
}

2. 数据库层:SQLDelight

SQLDelight 通过解析 .sq 文件自动生成 Kotlin 代码,保证了 SQL 的类型安全。

kotlin
sqldelight {
    databases {
        create("AppDatabase") {
            packageName.set("com.example.db")
        }
    }
}
kotlin
val driver = AndroidSqliteDriver(AppDatabase.Schema, context, "app.db")
kotlin
val driver = NativeSqliteDriver(AppDatabase.Schema, "app.db")

3. 依赖注入:Koin

Koin 是 KMP 最友好的 DI 库,其轻量级的设计非常适合跨平台初始化。

kotlin
fun initKoin(appModule: Module) {
    startKoin {
        modules(appModule, sharedModule)
    }
}

UI 架构模式:MVVM 与 MVI

在 KMP 中,虽然 UI 可能是分开写的,但 ViewModel 应该是共享的。

共享 ViewModel 模版

kotlin
open class BaseViewModel {
    val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())
    
    fun clear() {
        scope.cancel()
    }
}

社区插件

强烈推荐使用 SKIE 插件。它能自动优化 Kotlin FlowSealed Classes 在 Swift 侧的调用体验,让 Swift 代码看起来更像原生的。

推荐库清单 (2025版)

类别推荐库说明
持久化Multiplatform SettingsKV 存储的标准方案
时间Kotlinx Datetime官方跨平台日期库
日志Kermit / Napier专业的 KMP 日志系统
并发AtomicFU无锁原子操作
资源Compose Multiplatform Resources图片/字符串资源统一管理

时间与时区处理

API 核心签名说明

  • object Clock { object System }
  • Clock.System.now(): Instant
  • TimeZone.currentSystemDefault(): TimeZone
  • fun Instant.toLocalDateTime(timeZone: TimeZone): LocalDateTime
  • fun LocalDateTime.toInstant(timeZone: TimeZone): Instant

标准代码块

kotlin
import kotlinx.datetime.Clock
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime

fun buildAuditTimestamp(): String {
    val now = Clock.System.now()
    val local = now.toLocalDateTime(TimeZone.currentSystemDefault())
    return "${local.date} ${local.time}"
}

底层机制说明

Clock.System 在 commonMain 只提供统一的时间入口。 JVM 目标会委托给 java.time.Instant 读取系统时间。 Native 目标使用平台底层时间 API 获取当前时间戳。 JS 目标则以 Date 为后端实现,保持统一语义。 Instant 内部以 epoch seconds 与 nanos 表示绝对时刻。 这种表示与时区无关,适合跨平台序列化与持久化。 TimeZone 代表 IANA 时区规则集合,而不是固定偏移。 currentSystemDefault() 会读取系统设置并映射为 IANA ID。 toLocalDateTime 在转换时会查询时区规则并计算偏移量。 LocalDateTime 仅表示日历时间,不携带时区信息。 因此从 LocalDateTime 还原 Instant 必须显式提供 TimeZone。 库内部处理 DST 切换点,避免手写偏移造成逻辑错误。 API 全为 Kotlin 实现,公共逻辑可直接放在 commonMain。 推荐在网络与存储层使用 Instant 作为统一时间类型。 展示层再转换为本地时间以保持跨平台一致性。 该模型与 java.time 保持语义一致但不依赖 JDK。

依赖补充

kotlin
kotlin {
    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.0")
        }
    }
}
groovy
kotlin {
    sourceSets {
        commonMain {
            dependencies {
                implementation "org.jetbrains.kotlinx:kotlinx-datetime:0.6.0"
            }
        }
    }
}
toml
[versions]
kotlinx-datetime = "0.6.0"

[libraries]
kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" }

最新稳定版本查看链接:https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-datetime