Kotlin:跨平台魔法的秘密武器

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么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\n

KMP不是一个框架。它是内置于Kotlin语言中的编译技术。它允许将通用代码(common code)编译到不同的平台:

\n\n
    \n
  • Android — JVM字节码(如常)。
  • \n
  • iOS — 原生二进制文件(通过LLVM)。
  • \n
  • JavaScript/Web — 用于浏览器的JS代码。
  • \n
  • Native(Linux、Windows、macOS) — 通过Kotlin/Native。
  • \n
\n\n

主要特点:您编写expect/actual — 在通用代码中声明预期的API,然后为每个平台单独实现。其余部分都是通用的。

\n\n

示例1:网络请求的通用模块

\n\n

让我们编写一个简单的HTTP客户端,它可以在Android和iOS上运行。为此,我们使用Ktor — 一个用Kotlin编写的客户端。

\n\n

步骤1:项目结构(Gradle)

\n\n

在您的通用模块的build.gradle.kts文件中:

\n\n
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                

博客

书籍推荐