Kotlin Multiplatform vs Flutter
KMP (geteilte Businesslogik + native UI) vs. Flutter (geteilte UI + Runtime) — Vergleich von Cross-Platform-Mobile-Ansätzen. Performance, Developer Experience, Ökosystem.
Teile nur die Geschäftslogik, lass die UI nativ
UI und Geschäftslogik gemeinsam aus einer einzigen Codebasis
Es gibt keinen klaren Gewinner – das Szenario entscheidet. Wenn die UI nativ bleiben soll und nur die Netzwerk-/Daten-/Geschäftslogik geteilt werden soll und dein Team Kotlin/Android-nah ist, wähle KMP: Das offizielle Tutorial beschreibt genau, wie du das Shared Module zu Android hinzufügst und es als Xcode-Framework an iOS anbindest. Wenn du Bildschirme aus einer einzigen Codebasis erzeugen und das Web-Team ins Mobile-Projekt einbinden willst, liegt React Native vorn: Das Ökosystem mit 126.703 Stars und der offizielle Leitfaden „Integration with Existing Apps“ unterstützen das.
| Kategorie | Kotlin Multiplatform | React Native |
|---|---|---|
| Performance | 8/10 | 7/10 |
| Erlernbarkeit | 6/10 | 7/10 |
| Ökosystem | 6/10 | 9/10 |
| Community | 6/10 | 9/10 |
| Arbeitsmarkt | 6/10 | 7/10 |
| Zukunftssicherheit | 8/10 | 8/10 |
// KMP shared module — Hinzufügen zu bestehender Android/iOS App
// shared/src/commonMain/kotlin/data/UserRepository.kt
package com.app.shared.data
import kotlinx.coroutines.flow.Flow
import kotlinx.serialization.Serializable
@Serializable
data class User(val id: String, val name: String, val avatarUrl: String)
// Hinweis: kotlin.Result ist eine value class und wird nicht ins Objective-C exportiert;
// der Rückgabetyp ist direkt User, der Fehlerpfad läuft über throws/completion error.
class UserRepository(private val api: UserApi) {
suspend fun fetchUser(id: String): User = api.getUser(id)
}
// expect/actual: plattformspezifischer Teil (iOS Keychain / Android EncryptedSharedPreferences)
expect class SecureStorage {
fun save(key: String, value: String)
fun read(key: String): String?
}
// shared/build.gradle.kts (Zusammenfassung)
kotlin {
androidTarget()
listOf(iosX64(), iosArm64(), iosSimulatorArm64()).forEach {
it.binaries.framework { baseName = "Shared" }
}
sourceSets {
commonMain.dependencies {
implementation("io.ktor:ktor-client-core:3.6.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0")
}
}
}
// Einbindung auf der iOS-Seite als Xcode-Framework (Swift)
import Shared
let repo = UserRepository(api: UserApiImpl())
repo.fetchUser(id: "42") { user, error in
if let user = user { print(user.name) }
}// React Native — Integration in bestehende App; index.js: Bildschirm registrieren
import { AppRegistry } from 'react-native';
import ProfileScreen from './src/ProfileScreen';
AppRegistry.registerComponent('ProfileScreen', () => ProfileScreen);
// src/ProfileScreen.tsx — Strict TypeScript API (Standard seit RN 0.87)
import { View, Text } from 'react-native';
export default function ProfileScreen({ userId }: { userId: string }) {
return (
<View style={{ padding: 16 }}>
<Text style={{ fontSize: 17 }}>Benutzer {userId}</Text>
</View>
);
}
// android/app/build.gradle — RN Gradle Plugin (Zusammenfassung)
apply plugin: "com.facebook.react"
react { autolinkLibrariesWithApp() }
// MyReactActivity.kt — Muster aus dem offiziellen Leitfaden
import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate
class MyReactActivity : ReactActivity() {
override fun getMainComponentName(): String = "ProfileScreen"
override fun createReactActivityDelegate(): ReactActivityDelegate =
DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)
}
// AndroidManifest.xml: <activity android:name=".MyReactActivity"
// android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
// aus deiner bestehenden Activity: startActivity(Intent(this, MyReactActivity::class.java))Es gibt keinen klaren Gewinner – das Szenario entscheidet. Wenn die UI nativ bleiben soll und nur die Netzwerk-/Daten-/Geschäftslogik geteilt werden soll und dein Team Kotlin/Android-nah ist, wähle KMP: Das offizielle Tutorial beschreibt genau, wie du das Shared Module zu Android hinzufügst und es als Xcode-Framework an iOS anbindest. Wenn du Bildschirme aus einer einzigen Codebasis erzeugen und das Web-Team ins Mobile-Projekt einbinden willst, liegt React Native vorn: Das Ökosystem mit 126.703 Stars und der offizielle Leitfaden „Integration with Existing Apps“ unterstützen das.
Kostenlose Beratung erhaltenEs gibt keine eindeutige Antwort, das hängt vom Team-Skillset ab: Bist du ein Kotlin/Android-Team und soll die UI nativ bleiben, wähle KMP. Bist du ein Web-/React-Team und willst Bildschirme aus einer einzigen Codebasis erzeugen, wähle React Native. Beide unterstützen offiziell die schrittweise Integration in eine bestehende App.