Compose Multiplatform مقابل Flutter
Jetpack Compose Multiplatform (إصدار عام لـ iOS في 2024) مقابل Flutter — أطر عمل واجهة المستخدم متعددة المنصات. Kotlin مقابل Dart، النظام البيئي، وتكافؤ iOS.
قاعدة كود واجهة مستخدم واحدة بلغة Kotlin لأندرويد + iOS + سطح المكتب + الويب
إطار عمل Apple الأصلي التصريحي لواجهة المستخدم — اللغة المشتركة لكل عائلة المنصات
إذا كان لديك فريق Android/Kotlin قوي وتريد التوسع إلى iOS بأقل تكلفة، فإن Compose Multiplatform خيار منطقي: هدف iOS أصبح Stable منذ مايو 2025. لكن في المنتج الذي تكون فيه واجهة iOS هي الواجهة الرئيسية، وتحتاج لاستخدام ابتكارات مثل Liquid Glass (iOS 26+) منذ اليوم الأول، يصعب تجاوز SwiftUI — حتى التوثيق الرسمي يوصي بالعودة إلى غلاف SwiftUI الأصلي لهذه اللغة البصرية. بينما يُعلن رسميًا عن حجم إضافي بحدود 9 ميغابايت، أبلغت حالة مستقلة واحدة عن فرق يصل إلى 12 ضعفًا؛ قِس النموذج الأولي الخاص بك على جهاز حقيقي.
| الفئة | Compose Multiplatform | SwiftUI |
|---|---|---|
| الأداء | 7/10 | 9/10 |
| سهولة التعلّم | 6/10 | 7/10 |
| النظام البيئي | 6/10 | 9/10 |
| المجتمع | 6/10 | 9/10 |
| سوق العمل | 5/10 | 9/10 |
| الاستدامة المستقبلية | 7/10 | 9/10 |
// Compose Multiplatform - commonMain: بطاقة ملف تعريف مشتركة
// (build.gradle.kts: kotlin { androidTarget(); iosArm64(); iosSimulatorArm64() })
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.*
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImage
@Composable
fun ProfileCard(user: User, modifier: Modifier = Modifier) {
var isFollowing by remember { mutableStateOf(false) }
Row(
modifier = modifier.fillMaxWidth().padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
AsyncImage(
model = user.avatarUrl,
contentDescription = user.name,
modifier = Modifier.size(64.dp).clip(CircleShape)
)
Spacer(Modifier.width(12.dp))
Column(modifier = Modifier.weight(1f)) {
Text(user.name, style = MaterialTheme.typography.titleMedium)
Text(user.title, style = MaterialTheme.typography.bodySmall)
}
OutlinedButton(onClick = { isFollowing = !isFollowing }) {
Text(if (isFollowing) "إلغاء المتابعة" else "متابعة")
}
}
}
// iosMain: تصدير عرض CMP كـ UIViewController
fun MainViewController() = ComposeUIViewController { ProfileCard(user = sampleUser) }// SwiftUI - بطاقة ملف تعريف
import SwiftUI
struct ProfileCard: View {
let user: User
@State private var isFollowing = false
var body: some View {
HStack(spacing: 12) {
AsyncImage(url: user.avatarURL) { image in
image.resizable().scaledToFill()
} placeholder: {
ProgressView()
}
.frame(width: 64, height: 64)
.clipShape(Circle())
VStack(alignment: .leading) {
Text(user.name)
.font(.headline)
Text(user.title)
.font(.subheadline)
.foregroundStyle(.secondary)
}
Spacer()
Button(isFollowing ? "إلغاء المتابعة" : "متابعة") {
withAnimation(.spring(response: 0.3)) {
isFollowing.toggle()
}
}
.buttonStyle(.bordered)
}
.padding()
}
}
#Preview {
ProfileCard(user: .sample)
}إذا كان لديك فريق Android/Kotlin قوي وتريد التوسع إلى iOS بأقل تكلفة، فإن Compose Multiplatform خيار منطقي: هدف iOS أصبح Stable منذ مايو 2025. لكن في المنتج الذي تكون فيه واجهة iOS هي الواجهة الرئيسية، وتحتاج لاستخدام ابتكارات مثل Liquid Glass (iOS 26+) منذ اليوم الأول، يصعب تجاوز SwiftUI — حتى التوثيق الرسمي يوصي بالعودة إلى غلاف SwiftUI الأصلي لهذه اللغة البصرية. بينما يُعلن رسميًا عن حجم إضافي بحدود 9 ميغابايت، أبلغت حالة مستقلة واحدة عن فرق يصل إلى 12 ضعفًا؛ قِس النموذج الأولي الخاص بك على جهاز حقيقي.
احصل على استشارة مجانيةنعم — أعلنت JetBrains رسميًا في مايو 2025 مع CMP 1.8.0 أن هدف iOS أصبح Stable وجاهزًا للإنتاج؛ واكتمل التنقل الآمن من ناحية الأنواع، ودعم VoiceOver من الدرجة الأولى، والتفاعل مع SwiftUI/UIKit. لكن كلمة 'جاهز' لا تعني أنه الخيار الصحيح لكل مشروع: حالة مطوّر مستقل نُشرت في 2 أغسطس 2026 تُبلغ عن تنازلات جدية في الحجم والشعور الأصلي في تطبيق CMP وصل إلى الإنتاج (تجربة مطوّر واحد). لا تقرر قبل أن تقيس بنفسك.