Kotlin Multiplatform vs Flutter
KMP (منطق أعمال مشترك + واجهة مستخدم native) مقابل Flutter (واجهة مستخدم وruntime مشتركين) — مقارنة بين حلول تطوير الجوال متعدد المنصات. الأداء، تجربة المطور، النظام البيئي.
شارك منطق الأعمال فقط، وأبقِ واجهة المستخدم (UI) أصلية (native)
أنتج واجهة المستخدم (UI) ومنطق الأعمال معًا من قاعدة كود واحدة
لا يوجد فائز واضح، فالسيناريو هو الذي يحدّد. إذا كنت تريد إبقاء واجهة المستخدم (UI) أصلية (native) ومشاركة طبقة الشبكة/البيانات/منطق الأعمال فقط، وكان فريقك قريبًا من Kotlin/Android، فاختر KMP: إضافة الوحدة المشتركة (shared module) إلى Android وربطها بـ iOS كـ framework في Xcode موثّقة بشكل رسمي في البرنامج التعليمي (tutorial). أما إذا كنت تريد إنتاج الشاشات من قاعدة كود واحدة وضم فريق الويب إلى الجوال، فإن React Native يبرز: نظامه البيئي الذي يضم 126,703 نجمة ودليل "Integration with Existing Apps" الرسمي يدعمان ذلك.
| الفئة | Kotlin Multiplatform | React Native |
|---|---|---|
| الأداء | 8/10 | 7/10 |
| سهولة التعلّم | 6/10 | 7/10 |
| النظام البيئي | 6/10 | 9/10 |
| المجتمع | 6/10 | 9/10 |
| سوق العمل | 6/10 | 7/10 |
| الاستدامة المستقبلية | 8/10 | 8/10 |
// وحدة KMP المشتركة (shared module) — الإضافة إلى تطبيق Android/iOS حالي
// 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)
// ملاحظة: kotlin.Result هو value class ولا يُصدَّر إلى Objective-C؛
// نوع الإرجاع هو User مباشرة، ومسار الخطأ يمر عبر throws/completion error.
class UserRepository(private val api: UserApi) {
suspend fun fetchUser(id: String): User = api.getUser(id)
}
// expect/actual: الجزء الخاص بكل منصة (iOS Keychain / Android EncryptedSharedPreferences)
expect class SecureStorage {
fun save(key: String, value: String)
fun read(key: String): String?
}
// shared/build.gradle.kts (ملخّص)
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")
}
}
}
// الربط في جانب iOS كـ 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 — الدمج في تطبيق حالي؛ index.js: تسجيل الشاشة
import { AppRegistry } from 'react-native';
import ProfileScreen from './src/ProfileScreen';
AppRegistry.registerComponent('ProfileScreen', () => ProfileScreen);
// src/ProfileScreen.tsx — Strict TypeScript API (افتراضي في 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 }}>المستخدم {userId}</Text>
</View>
);
}
// android/app/build.gradle — RN Gradle Plugin (ملخّص)
apply plugin: "com.facebook.react"
react { autolinkLibrariesWithApp() }
// MyReactActivity.kt — النمط الوارد في الدليل الرسمي
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" />
// من الـ Activity الحالية: startActivity(Intent(this, MyReactActivity::class.java))لا يوجد فائز واضح، فالسيناريو هو الذي يحدّد. إذا كنت تريد إبقاء واجهة المستخدم (UI) أصلية (native) ومشاركة طبقة الشبكة/البيانات/منطق الأعمال فقط، وكان فريقك قريبًا من Kotlin/Android، فاختر KMP: إضافة الوحدة المشتركة (shared module) إلى Android وربطها بـ iOS كـ framework في Xcode موثّقة بشكل رسمي في البرنامج التعليمي (tutorial). أما إذا كنت تريد إنتاج الشاشات من قاعدة كود واحدة وضم فريق الويب إلى الجوال، فإن React Native يبرز: نظامه البيئي الذي يضم 126,703 نجمة ودليل "Integration with Existing Apps" الرسمي يدعمان ذلك.
احصل على استشارة مجانيةلا توجد إجابة قاطعة، الأمر يتوقف على مهارة الفريق: إذا كان فريقك Kotlin/Android وتريد إبقاء واجهة المستخدم أصلية (native) فاختر KMP؛ وإذا كان فريقك web/React وتريد إنتاج الشاشات من قاعدة كود واحدة فاختر React Native. كلاهما يدعم رسميًا الإضافة التدريجية إلى تطبيق حالي.