Compose Multiplatform vs Flutter
Jetpack Compose Multiplatform(iOS版はGA済み、2024年〜)とFlutter — クロスプラットフォームUIフレームワークの比較。Kotlin vs Dart、エコシステム、iOSでの完成度。
Kotlinから単一のUIコードベースでAndroid + iOS + Desktop + Webをカバー
Appleのネイティブな宣言的UIフレームワーク——プラットフォームファミリー全体の共通言語
強力なAndroid/Kotlinチームがあり、最小コストでiOSに展開したいならCompose Multiplatformは理にかなっている——iOSターゲットは2025年5月からStableだ。ただしiOSが製品の顔であり、Liquid Glassのような新機能(iOS 26+)を発表当日から使う必要がある製品では、SwiftUIを上回るのは難しい——公式ドキュメント自身もこの視覚言語にはネイティブSwiftUIシェルへの回帰を勧めている。サイズについては公式は約9MBとしているが、独立した1事例では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が製品の顔であり、Liquid Glassのような新機能(iOS 26+)を発表当日から使う必要がある製品では、SwiftUIを上回るのは難しい——公式ドキュメント自身もこの視覚言語にはネイティブSwiftUIシェルへの回帰を勧めている。サイズについては公式は約9MBとしているが、独立した1事例では12倍の差が報告されている。自分のプロトタイプを実機で計測すること。
無料相談を受けるはい——JetBrainsは2025年5月、CMP 1.8.0でiOSターゲットを正式にStableかつ本番投入可能と発表した。型安全なナビゲーション、ファーストクラスのVoiceOverサポート、SwiftUI/UIKitとの相互運用が完成している。ただし「対応している」ことがすべてのプロジェクトで正しい選択を意味するわけではない。2026年8月2日に公開された独立開発者の事例では、本番投入されたCMPアプリでサイズとネイティブな操作感について深刻なトレードオフが報告されている(単一の開発者の経験)。自分で計測せずに判断しないこと。