2024 年有一个被反复讨论的话题:跨端框架已经"卷"出结果了吗?现在是 2026 年,答案依然是:没有。
不是因为这些框架还不够成熟,而是因为它们在各自的战场上都活得很好------Flutter 继续统治 UI 表现力,React Native 凭借 New Architecture 重回舞台,Kotlin Multiplatform 悄悄占据了"不想重写 UI 但又想共享逻辑"的细分市场,小程序则在国内流量闭环里自成生态。
这篇文章的目的不是"评选冠军",而是把 2026 年的技术现状摆出来,帮你做一个真实的技术选型判断。我会尽量给出明确的观点,而不是"都挺好都有适用场景"的废话结论。
选型前的一个元问题
在进入各框架对比之前,有一个问题必须先回答:你想跨的"端"是什么?
这个问题听起来很基础,但实际选型中被忽视的频率高得惊人。"跨端"至少有四种完全不同的含义:
• Android + iOS(移动双端)
• 移动 + Web(三端)
• 移动 + Desktop(桌面端,包括 macOS/Windows/Linux)
• 微信/支付宝/抖音等超级App内的小程序生态
不同的跨端目标,对应的最优解差异极大。把这个问题想清楚,后面的对比才有意义。
Flutter:性能天花板,但生态成本是真实的
Flutter 的核心优势从诞生之初就没变过:自绘引擎 + Dart,完全绕开平台 UI 组件,在任何平台上渲染出一致的像素级效果。2026 年这个优势依然成立,在动效复杂、UI 高度定制的场景里,Flutter 仍然是我的第一推荐。
但有几个问题需要直说:
包体积问题从未真正解决。一个最简单的 Flutter App,Release 包在 Android 上依然接近 10MB 起步。对于独立 App 这不是大问题,但如果你是想把 Flutter 嵌入已有的 Native App(即 Add-to-App 模式),包体积带来的 APK 膨胀和 so 加载开销是真实的工程成本。
Platform Channel 的摩擦依然存在。自绘引擎的代价是与原生生态的隔离。每当你需要调用一个平台特有能力(相机、蓝牙、地图 SDK、推送 SDK),都需要通过 Platform Channel 或 Method Channel 搭桥,而这些三方插件的质量参差不齐------尤其是企业级 SDK(腾讯云、阿里系、各类支付 SDK),Flutter 适配往往比 React Native 慢半个身位。
Dart 的"独占性"是把双刃剑。前端工程师学 Dart 有一定成本,Android 工程师也不一定愿意切换。这在团队层面是真实的摩擦。
一个真实可用的 Flutter 跨平台组件示例,展示如何用 Platform Channels 调用原生能力:
kotlin
// Flutter 侧:通过 MethodChannel 调用原生能力
import 'package:flutter/services.dart';
class NativeBridge {
static const MethodChannel _channel = MethodChannel('com.example/native');
// 调用原生获取设备信息
static Future> getDeviceInfo() async {
try {
final result = await _channel.invokeMethod('getDeviceInfo');
return Map.from(result);
} on PlatformException catch (e) {
debugPrint('Native call failed: ${e.message}');
return {};
}
}
}
// Android 侧(Kotlin):注册 MethodChannel 处理器
class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"com.example/native"
).setMethodCallHandler { call, result ->
when (call.method) {
"getDeviceInfo" -> result.success(mapOf(
"model" to Build.MODEL,
"sdk" to Build.VERSION.SDK_INT,
"manufacturer" to Build.MANUFACTURER
))
else -> result.notImplemented()
}
}
}
}
我的判断:Flutter 最适合新项目、UI 高度定制、团队可以接受 Dart 学习成本的场景。如果是存量 Native 项目局部接入,或者对接企业级 SDK 较多,成本会显著高于预期。
React Native:New Architecture 是真正的转折点
React Native 在 2022-2023 年间一度被唱衰,性能问题、Bridge 瓶颈、社区碎片化......这些批评都有道理。但 New Architecture(Fabric + JSI + TurboModules)的全面落地,让 React Native 在 2025 年之后重新变得有竞争力。
New Architecture 最核心的变化是干掉了异步 Bridge。旧架构里,JS 和原生之间的所有通信都是异步序列化消息,这是性能问题的根源。JSI(JavaScript Interface)直接让 JS 持有原生对象的 C++ 引用,调用变成同步操作,手感完全不同。
typescript
// New Architecture:用 Turbo Module 实现类型安全的原生模块
// JS 规范文件(NativeDeviceInfo.ts)
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';
export interface Spec extends TurboModule {
getDeviceModel(): string;
getBatteryLevel(): Promise;
// Codegen 会根据这个接口自动生成 Android/iOS 原生代码框架
}
export default TurboModuleRegistry.getEnforcing('NativeDeviceInfo');
// 使用时直接同步调用,无需等待 Bridge
import NativeDeviceInfo from './NativeDeviceInfo';
const model = NativeDeviceInfo.getDeviceModel(); // 同步,不阻塞 UI 线程
NativeDeviceInfo.getBatteryLevel().then(level => console.log(level));
React Native 的核心优势在于:前端工程师零门槛入场,组件生态极其丰富,与 Web 技术栈共享人才。对于有前端团队的公司,这是最低摩擦的跨端路径。
但要说清楚的是:React Native 的 UI 是用平台原生组件渲染的,不是自绘。这意味着在不同平台上,相同代码可能渲染出略有差异的 UI------这既是它"更接近原生体验"的优势,也是像素级一致性的短板。
我的判断:前端团队主导、需要快速迭代、对 UI 一致性要求不是极致严苛的业务场景,React Native New Architecture 是性价比最高的方案。
Kotlin Multiplatform:逻辑共享而非 UI 统一,这个定位值钱
KMP(Kotlin Multiplatform)一直被误解。很多人把它和 Flutter / React Native 放在同一个坐标系里比较,这是错的。KMP 从设计之初就不是要统一 UI,而是让业务逻辑、数据层、网络层在 Android / iOS / Desktop / Web 之间共享,UI 仍然交给各平台原生或 Compose 处理。
这个定位对存量项目来说非常珍贵。你不需要重写整个 App,只需要把共享逻辑提取到 KMP 模块:
scss
// commonMain - 这段代码同时编译为 Android .aar 和 iOS .xcframework
// build.gradle.kts(KMP 模块配置)
kotlin {
androidTarget()
iosX64(); iosArm64(); iosSimulatorArm64()
sourceSets {
commonMain.dependencies {
implementation("io.ktor:ktor-client-core:3.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.0")
implementation("app.cash.sqldelight:runtime:2.3.2") // SQLDelight 2.3.2
}
androidMain.dependencies {
implementation("io.ktor:ktor-client-okhttp:3.0.0")
implementation("app.cash.sqldelight:android-driver:2.3.2")
}
iosMain.dependencies {
implementation("io.ktor:ktor-client-darwin:3.0.0")
implementation("app.cash.sqldelight:native-driver:2.3.2")
}
}
}
// 共享的数据层逻辑
class ArticleRepository(private val db: AppDatabase, private val api: ArticleApi) {
suspend fun getArticles(forceRefresh: Boolean = false): List {
if (!forceRefresh) {
val cached = db.articleQueries.selectAll().executeAsList()
if (cached.isNotEmpty()) return cached.map { it.toDomain() }
}
val remote = api.fetchArticles()
db.articleQueries.transaction {
remote.forEach { db.articleQueries.insert(it.toEntity()) }
}
return remote
}
}
2026 年 KMP 生态有几个值得关注的进展:
• SQLDelight 2.3.2 已经相当稳定,跨平台数据库方案不再是实验性质,Android/iOS/Desktop 共享数据层在生产环境是可行的
• Coil 3.4.0 完全拥抱 KMP,主流图片加载库的支持意味着 KMP 在 Android 生态中的"一等公民"地位越来越实
• Compose Multiplatform v1.11.10-alpha01(2026-04-14 刚发布)表明 JetBrains 在推进 UI 统一层面没有停步,lifecycle 2.11 和 navigation3 的多平台支持让 CMP 越来越接近可用状态
但 Compose Multiplatform 的成熟度需要区分对待:在 iOS 上,CMP 渲染仍然依赖 Skia/Skiko 绘制,和 Flutter 类似,存在与 iOS 原生组件的视觉差异问题。目前在 iOS 端的稳定性和第三方 SDK 接入体验,还不如直接用 SwiftUI。
我的判断:KMP 是"渐进式跨端"的最优路径,对 Android 工程师友好,不需要放弃现有 Native 代码。如果你的团队以 Android 开发为主,又需要向 iOS 扩张,KMP 共享逻辑层 + iOS Native UI 是目前风险最低的组合。
Compose Hot Reload:跨端开发体验的新变量
Android Weekly #722 重点介绍了 Compose Hot Reload,这个特性值得单独说一下。
Hot Reload 对于跨端开发的意义在于:UI 迭代的反馈循环从"改代码 → 编译 → 安装 → 找到对应页面"(30秒起步)缩短到"改代码 → 即时更新"(秒级)。Flutter 靠 Dart VM 一直有这个能力,而 Compose Hot Reload 让 Kotlin 原生开发也追上来了。
更重要的是,这个能力在 Compose Multiplatform 上同样可用------意味着你在 Desktop 上用 Hot Reload 快速打磨 UI,同一份代码最终部署到 Android/iOS/Desktop 多端,这是体验上的实质性提升。
但当前 Hot Reload 有一定限制:类结构变更(新增方法、修改类层次)不支持热重载,只有函数体内的逻辑修改和 Composable 内容变更可以即时生效。这和 Flutter 的 Hot Reload 限制基本一致。
小程序:不是技术选型,是流量选型
把小程序放进跨端框架横评,其实有点奇怪------小程序不是你"选不选"的技术问题,而是"你的业务需不需要接入微信/支付宝/抖音这些超级 App 的流量生态"的商业问题。
但技术层面确实有值得说的地方:
Taro / uni-app 这类"小程序跨端框架的跨端框架",让一套代码同时跑在微信/支付宝/抖音/H5,是工程效率的合理选择。但要清楚它的天花板:小程序的 WXML/WXSS 是静态化的,受限于宿主 App 的渲染能力,动效和交互复杂度有硬限制。
javascript
// Taro 3.x:用 React 写法,编译到微信/支付宝/抖音小程序
import { View, Text, Button } from '@tarojs/components'
import Taro from '@tarojs/taro'
export default function ProductCard({ product }) {
const handleBuy = () => {
// 跨端 API:Taro 会编译为各平台对应的实现
Taro.navigateTo({ url: `/pages/order/index?id=${product.id}` })
}
return (
{product.name}
¥{product.price}
立即购买
)
}
// 编译命令:
// npx taro build --type weapp → 微信小程序
// npx taro build --type alipay → 支付宝小程序
// npx taro build --type tt → 抖音小程序
// npx taro build --type h5 → Web H5
我的判断:小程序是流量分发的基础设施,不是技术架构的核心选择。对于 ToC 业务,它是必做的,不是可选的。但你的 App 核心体验不应该押注在小程序上------宿主 App 的运行时限制太多,长期来看要有独立 App 的备份。
四个框架的横向对比
| 维度 | Flutter | React Native | KMP | 小程序(Taro) |
|---|---|---|---|---|
| UI 一致性 | 极高(自绘) | 中(原生组件) | 各平台原生 | 受宿主限制 |
| 性能天花板 | 高 | 中高(New Arch) | 原生级别 | 中 |
| 技术栈 | Dart | JS/TS + React | Kotlin | JS/TS |
| 存量项目接入 | 成本高 | 中等 | 低(逻辑层) | 新建为主 |
| 三方 SDK 生态 | 中(靠 Channel) | 高 | 高(复用原生) | 受宿主限制 |
| Desktop 支持 | 有(Beta 偏稳) | 弱 | 有(CMP) | 无 |
| 最适合 | 新项目、高 UI 要求 | 前端团队主导 | Android 团队扩 iOS | ToC 流量分发 |
2026 年真实的技术选型流程
不给具体判断的技术文章都是在耍流氓。这里给一个我实际会用的决策路径:
决策树(从上往下,命中即停)
起点:你的主力团队是什么背景?
前端/Web 团队 → React Native(New Architecture),顺带覆盖 Web
Android 原生团队 → KMP 共享逻辑 + iOS SwiftUI;若需要 UI 统一考虑 CMP(但要接受 iOS 端的成熟度风险)
全新项目 + UI 高度定制 → Flutter,Dart 学习曲线接受的话这是体验天花板
ToC 业务需要流量入口 → 小程序必做(Taro 跨多小程序平台),但不要让它成为核心载体
特殊情况:需要 Mobile + Desktop(macOS/Windows)→ Flutter 或 CMP,两者在 Desktop 支持上是目前最成熟的选择
一个容易被忽视的趋势:AI 集成正在改变跨端框架的竞争格局
KotlinConf'26 的演讲阵容里,AI 与 Multiplatform 的交汇是一个明显的信号。Kotlin Blog 3 月月报里也专门提到了 AI 集成方向的进展。
这背后有一个逻辑:本地 LLM 推理(ONNX Runtime、Core ML、TensorFlow Lite)正在成为 App 的标配能力,而不同框架对这些能力的接入成本差异很大。Flutter 需要通过 Platform Channel 调用,React Native 类似,而 KMP 可以直接复用原生 ML 框架,理论上接入成本最低。
如果你的 App 在接下来 1-2 年有集成端侧 AI 能力的计划,这一点值得在选型时权衡进去。
结语
2026 年的跨端框架格局,不是一个"谁赢了"的故事,而是一个"各就各位"的格局。Flutter 守住了 UI 表现力的领地,React Native 靠 New Architecture 打了一场漂亮的翻身仗,KMP 用渐进式策略拿下了最务实的工程师群体,小程序则在流量分发的赛道上自成一派。
选型不需要纠结"哪个更好",需要回答的是"谁更适合我的团队、我的业务、我的时间窗口"。
下一步值得持续关注的方向:Compose Multiplatform 在 iOS 端的稳定性演进(JetBrains 在这上面的投入力度很大,预计 2026 年底会有显著改善),以及各框架对端侧 AI 推理能力的接入成本------这会是下一个选型维度。
如果这篇对你有帮助,欢迎转发给正在做跨端选型的同事。