为什么Kotlin不仅仅用于Android?
\n\n如果您至今仍认为Kotlin只是Android的“增强版Java”,那您就错过了重点。在这个人人都想编写一次代码并在各处运行的世界里,Kotlin Multiplatform (KMP) 正成为Flutter和React Native等框架的真正“杀手”。但与它们不同,Kotlin不会强迫您放弃原生UI或学习JavaScript。
\n\n想象一下:您用Kotlin一次编写业务逻辑、网络请求和数据库操作。然后,您可以在Android、iOS、Web甚至服务器端(Ktor)上使用这些代码。听起来像科幻小说?欢迎来到Kotlin跨平台开发的现实。
\n\n在本文中,我们不仅会讨论理论。我们将展示真实的代码示例,将KMP与竞争对手进行比较,并为您提供今天就可以开始的分步计划。
\n\n什么是Kotlin Multiplatform (KMP)?为什么需要它?
\n\nKMP不是一个框架。它是内置于Kotlin语言中的编译技术。它允许将通用代码(common code)编译到不同的平台:
\n\n- \n
- Android — JVM字节码(如常)。 \n
- iOS — 原生二进制文件(通过LLVM)。 \n
- JavaScript/Web — 用于浏览器的JS代码。 \n
- Native(Linux、Windows、macOS) — 通过Kotlin/Native。 \n
主要特点:您编写expect/actual — 在通用代码中声明预期的API,然后为每个平台单独实现。其余部分都是通用的。
\n\n示例1:网络请求的通用模块
\n\n让我们编写一个简单的HTTP客户端,它可以在Android和iOS上运行。为此,我们使用Ktor — 一个用Kotlin编写的客户端。
\n\n步骤1:项目结构(Gradle)
\n\n在您的通用模块的build.gradle.kts文件中:
plugins {\n kotlin("multiplatform")\n id("io.ktor.plugin") version "2.3.7"\n}\n\nkotlin {\n androidTarget()\n iosX64()\n iosArm64()\n iosSimulatorArm64()\n\n sourceSets {\n val commonMain by getting {\n dependencies {\n implementation("io.ktor:ktor-client-core:2.3.7")\n implementation("io.ktor:ktor-client-content-negotiation:2.3.7")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n }\n }\n val androidMain by getting {\n dependencies {\n implementation("io.ktor:ktor-client-android:2.3.7")\n }\n }\n val iosMain by creating {\n dependsOn(commonMain)\n dependencies {\n implementation("io.ktor:ktor-client-darwin:2.3.7")\n }\n }\n }\n}\n\n步骤2:通用代码(commonMain)
\n\n创建一个data class和API客户端:
\n\n// commonMain/kotlin/com/example/User.kt\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class User(\n val id: Int,\n val name: String,\n val email: String\n)\n\n// commonMain/kotlin/com/example/ApiClient.kt\nimport io.ktor.client.*\nimport io.ktor.client.call.*\nimport io.ktor.client.plugins.contentnegotiation.*\nimport io.ktor.client.request.*\nimport io.ktor.serialization.kotlinx.json.*\n\nclass ApiClient {\n private val client = HttpClient {\n install(ContentNegotiation) {\n json()\n }\n }\n\n suspend fun fetchUser(id: Int): User {\n return client.get("https://jsonplaceholder.typicode.com/users/$id").body()\n }\n}\n\n看到了吗?没有if语句,没有平台检查。只有纯粹的Kotlin。
\n\n示例2:用于SharedPreferences的Expect/Actual
\n\n假设我们需要保存一个令牌。在Android上是SharedPreferences,在iOS上是UserDefaults。展示KMP的魔力:
\n\n通用代码(commonMain):
\n\n// commonMai