Kotlin Multiplatform 与 Flutter 对比
KMP(共享业务逻辑 + 原生 UI)与 Flutter(共享 UI + 运行时)——跨平台移动开发对比。性能、开发者体验、生态系统。
只共享业务逻辑,UI 保持原生
用单一代码库同时产出 UI 与业务逻辑
没有绝对的赢家,取决于场景。如果你希望 UI 保持原生、只共享网络/数据/业务逻辑层,且团队更接近 Kotlin/Android,那就选择 KMP:将 shared module 加入 Android 项目、再以 Xcode framework 形式接入 iOS,这一流程在官方教程中有明确定义。如果你想用单一代码库产出界面、并让 Web 团队也参与移动端开发,React Native 更合适:拥有 126,703 个 star 的生态系统以及官方 "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 端以 Xcode framework 方式接入(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 — 严格 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 保持原生、只共享网络/数据/业务逻辑层,且团队更接近 Kotlin/Android,那就选择 KMP:将 shared module 加入 Android 项目、再以 Xcode framework 形式接入 iOS,这一流程在官方教程中有明确定义。如果你想用单一代码库产出界面、并让 Web 团队也参与移动端开发,React Native 更合适:拥有 126,703 个 star 的生态系统以及官方 "Integration with Existing Apps" 指南都支持这一点。
获取免费咨询没有绝对答案,取决于团队技能:如果你是 Kotlin/Android 团队且希望 UI 保持原生,选 KMP;如果你是 Web/React 团队且希望用单一代码库产出界面,选 React Native。两者都官方支持向现有应用渐进式添加。