Kotlin Multiplatform vs Flutter
KMP (logique métier partagée + UI native) contre Flutter (UI partagée + runtime) — comparatif mobile cross-platform. Performance, expérience développeur, écosystème.
Partagez uniquement la logique métier, laissez l'UI native
Produisez l'UI et la logique métier ensemble depuis une seule base de code
Il n'y a pas de gagnant net, cela dépend du scénario. Si vous voulez laisser l'UI native et ne partager que la couche réseau/données/logique métier, et que votre équipe est proche de Kotlin/Android, choisissez KMP : ajouter le module partagé à Android puis le lier à iOS comme framework Xcode est défini par le tutoriel officiel. Si vous voulez produire les écrans depuis une seule base de code et intégrer l'équipe web au mobile, React Native se démarque : un écosystème de 126.703 étoiles et le guide officiel "Integration with Existing Apps" le confirment.
| Catégorie | Kotlin Multiplatform | React Native |
|---|---|---|
| Performance | 8/10 | 7/10 |
| Facilité d'apprentissage | 6/10 | 7/10 |
| Écosystème | 6/10 | 9/10 |
| Communauté | 6/10 | 9/10 |
| Marché de l'emploi | 6/10 | 7/10 |
| Pérennité | 8/10 | 8/10 |
// Module partagé KMP — ajout à une application Android/iOS existante
// 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)
// Remarque : kotlin.Result est une value class et n'est pas exporté vers Objective-C ;
// le type de retour est directement User, le chemin d'erreur passe par throws/completion error.
class UserRepository(private val api: UserApi) {
suspend fun fetchUser(id: String): User = api.getUser(id)
}
// expect/actual : partie spécifique à la plateforme (iOS Keychain / Android EncryptedSharedPreferences)
expect class SecureStorage {
fun save(key: String, value: String)
fun read(key: String): String?
}
// shared/build.gradle.kts (résumé)
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")
}
}
}
// Côté iOS, liaison en tant que framework Xcode (Swift)
import Shared
let repo = UserRepository(api: UserApiImpl())
repo.fetchUser(id: "42") { user, error in
if let user = user { print(user.name) }
}// React Native — intégration dans une application existante ; index.js : enregistrer l'écran
import { AppRegistry } from 'react-native';
import ProfileScreen from './src/ProfileScreen';
AppRegistry.registerComponent('ProfileScreen', () => ProfileScreen);
// src/ProfileScreen.tsx — API TypeScript stricte (RN 0.87 par défaut)
import { View, Text } from 'react-native';
export default function ProfileScreen({ userId }: { userId: string }) {
return (
<View style={{ padding: 16 }}>
<Text style={{ fontSize: 17 }}>Utilisateur {userId}</Text>
</View>
);
}
// android/app/build.gradle — RN Gradle Plugin (résumé)
apply plugin: "com.facebook.react"
react { autolinkLibrariesWithApp() }
// MyReactActivity.kt — motif du guide officiel
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" />
// depuis votre Activity existante : startActivity(Intent(this, MyReactActivity::class.java))Il n'y a pas de gagnant net, cela dépend du scénario. Si vous voulez laisser l'UI native et ne partager que la couche réseau/données/logique métier, et que votre équipe est proche de Kotlin/Android, choisissez KMP : ajouter le module partagé à Android puis le lier à iOS comme framework Xcode est défini par le tutoriel officiel. Si vous voulez produire les écrans depuis une seule base de code et intégrer l'équipe web au mobile, React Native se démarque : un écosystème de 126.703 étoiles et le guide officiel "Integration with Existing Apps" le confirment.
Obtenir une consultation gratuiteIl n'y a pas de réponse définitive, cela dépend des compétences de l'équipe : KMP si vous avez une équipe Kotlin/Android et voulez laisser l'UI native ; React Native si vous avez une équipe web/React et voulez produire des écrans depuis une seule base de code. Les deux prennent officiellement en charge l'ajout progressif à une application existante.