Compose Multiplatform 与 Flutter
Jetpack Compose Multiplatform(iOS 于 2024 年正式发布)与 Flutter —— 跨平台 UI 框架对比。Kotlin 与 Dart、生态系统、iOS 平台对等性。
用同一套 Kotlin UI 代码库覆盖 Android + iOS + 桌面端 + Web
Apple 原生的声明式 UI 框架——整个平台家族的共同语言
如果你已经拥有一支实力强劲的 Android/Kotlin 团队,并希望以最低成本进军 iOS,那么 Compose Multiplatform 是合理的选择——其 iOS 目标平台自 2025 年 5 月起已进入 Stable 阶段。但如果 iOS 是产品的门面,必须在发布当天(day-0)就用上 Liquid Glass 等新特性(iOS 26+),要超越 SwiftUI 就很难——就连官方文档本身也建议为这类视觉语言使用原生 SwiftUI 外壳。在体积方面,官方给出的数字约为 9 MB,而一个独立案例报告的差距高达 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 目标平台自 2025 年 5 月起已进入 Stable 阶段。但如果 iOS 是产品的门面,必须在发布当天(day-0)就用上 Liquid Glass 等新特性(iOS 26+),要超越 SwiftUI 就很难——就连官方文档本身也建议为这类视觉语言使用原生 SwiftUI 外壳。在体积方面,官方给出的数字约为 9 MB,而一个独立案例报告的差距高达 12 倍;务必在真机上测量你自己的原型。
获取免费咨询是的——JetBrains 在 2025 年 5 月随 CMP 1.8.0 正式宣布 iOS 目标平台达到 Stable、可用于生产环境;类型安全导航、一流的 VoiceOver 支持以及 SwiftUI/UIKit 互操作性均已完成。但“可用”并不等于在每个项目中都是正确选择:2026 年 8 月 2 日发布的一份独立开发者案例报告指出,一款已上线的 CMP 应用在体积和原生体验上做出了明显的取舍(这是单个开发者的经验)。在没有自行测量之前不要贸然下结论。