Warum Kotlin nicht nur für Android ist?
\n\nWenn Sie immer noch denken, dass Kotlin nur ein "verbessertes Java" für Android ist, dann übersehen Sie das Wesentliche. In einer Welt, in der jeder einen Code schreiben und überall ausführen möchte, wird Kotlin Multiplatform (KMP) zu einem echten "Killer" von Frameworks wie Flutter und React Native. Aber im Gegensatz zu diesen zwingt Sie Kotlin nicht, auf native UI zu verzichten oder JavaScript zu lernen.
\n\nStellen Sie sich vor: Sie schreiben die Geschäftslogik, Netzwerkanfragen und die Datenbankarbeit einmal in Kotlin. Und dann verwenden Sie diesen Code auf Android, iOS, im Web und sogar auf dem Server (Ktor). Klingt nach Science-Fiction? Willkommen in der Realität der plattformübergreifenden Entwicklung mit Kotlin.
\n\nIn diesem Artikel erzählen wir nicht nur von der Theorie. Wir zeigen echte Codebeispiele, vergleichen KMP mit der Konkurrenz und geben Ihnen einen schrittweisen Plan, wie Sie noch heute beginnen können.
\n\nWas ist Kotlin Multiplatform (KMP) und warum wird es benötigt?
\n\nKMP ist kein Framework. Es ist eine in die Sprache Kotlin integrierte Compiler-Technologie. Sie ermöglicht es, gemeinsamen Code (common code) für verschiedene Plattformen zu kompilieren:
\n\n- \n
- Android — JVM-Bytecode (wie üblich). \n
- iOS — natives Binärformat (über LLVM). \n
- JavaScript/Web — JS-Code für den Browser. \n
- Native (Linux, Windows, macOS) — über Kotlin/Native. \n
Das Hauptmerkmal: Sie schreiben expect/actual — Sie deklarieren die erwartete API im gemeinsamen Code und implementieren sie für jede Plattform separat. Alles andere ist gemeinsam.
\n\nBeispiel 1: Gemeinsames Modul für Netzwerkanfragen
\n\nSchreiben wir einen einfachen HTTP-Client, der auf Android und iOS funktioniert. Dafür verwenden wir Ktor — einen in Kotlin geschriebenen Client.
\n\nSchritt 1: Projektstruktur (Gradle)
\n\nIn der Datei build.gradle.kts Ihres gemeinsamen Moduls:
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\nSchritt 2: Gemeinsamer Code (commonMain)
\n\nErstellen wir eine data class und einen API-Client:
\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\nSehen Sie? Keine if-Abfragen, keine plattformspezifischen Prüfungen. Einfach reines Kotlin.
\n\nBeispiel 2: Expect/Actual für die Arbeit mit SharedPreferences
\n\nAngenommen, wir müssen einen Token speichern. Auf Android — SharedPreferences, auf iOS — UserDefaults. Wir zeigen die Magie von KMP:
\n\nGemeinsamer Code (commonMain):
\n\n// commonMai