Flutter vs React Native vs Kotlin Multiplatform:我们踩过的 5 个选型坑(2026)
Flutter vs React Native vs Kotlin Multiplatform:我们踩过的 5 个选型坑(2026)
📖 摘要:2026 年跨平台移动开发已形成 Flutter、React Native、Kotlin Multiplatform 三强格局。本文用一张选型决策表对比三者渲染模型、性能、代码复用率与团队适配度,并结合一个中型电商 App 的落地过程,复盘我们踩过的 5 个典型坑,帮你在"要不要跨平台、选哪一套"这两个问题上少走弯路。读完你将掌握三者的工程边界与取舍逻辑。
🏷️ 关键词:跨平台开发,Flutter,React Native,Kotlin Multiplatform,移动架构
目录
一、背景与痛点
2026 年我们再谈跨平台,争论焦点早已不是"能不能复用代码",而是"哪套框架能让我们在对手之前,交付一个性能好、手感原生、还能跑端侧 AI 的 App"。某中型电商团队(下称"我们")在年初要同时覆盖 iOS 与 Android,且计划一年内上线小程序与桌面端。摆在面前的是三套主流方案:
- Flutter(Google):自绘引擎 Impeller 已成默认,Dart 静态元编程稳定。
- React Native(Meta):New Architecture(Fabric + TurboModules + JSI)在 2025 年底完成默认落地,2026 是首个完整量产年。
- Kotlin Multiplatform(JetBrains,下称 KMP):生产采用率近两年翻倍,Compose Multiplatform 的 iOS 版已稳定。
我们一开始就犯了"只看复用率"的错误,下面用一张表先给出三者的工程画像,再复盘真实踩坑。
二、三强画像
2.1 Flutter:自绘每一个像素
Flutter 用 Dart 在 Skia/Impeller 上自绘 UI,不依赖原生控件。它的核心卖点是跨端 UI 完全一致与强品牌感——金融、电商、健康这类重动画、强定制的 App 仍是首选。
// 一个典型的 Flutter 列表项:UI 由框架自绘,与原生控件无关
class ProductCard extends StatelessWidget {
final Product product;
const ProductCard(this.product, {super.key});
Widget build(BuildContext context) {
return Card(
elevation: 2,
child: Padding(
padding: const EdgeInsets.all(12),
child: Text(product.title, style: Theme.of(context).textTheme.titleMedium),
),
);
}
}
2026 年 Impeller 成为双端默认渲染引擎后,早年被诟病的着色器卡顿基本成为历史;Dart 的 macros(静态元编程)让 JSON 序列化与依赖注入的样板代码大幅减少。
2.2 React Native:New Architecture 文艺复兴
RN 在 2025 年底把 New Architecture 设为默认,异步桥接瓶颈被根除。常规负载下与原生性能差距已从 2022 年的 30%–40% 缩小到不足 8%;Hermes 在 Android 上的 AOT 让低端机启动时间最多缩短 40%。
// TurboModules 让原生能力以强类型方式暴露给 JS,不再走旧桥
import { TurboModuleRegistry } from 'react-native';
export interface Spec extends TurboModule {
getDeviceId(): string;
}
export default TurboModuleRegistry.get<Spec>('NativeDevice')!;
它最适合 Web 基因团队和需要快速铺功能的场景。JS 训练数据最丰富,AI 辅助编码的补全质量目前仍略占优。
2.3 Kotlin Multiplatform:共享逻辑、原生 UI
KMP 的思路与上面两者都不同:只共享业务逻辑,UI 仍用原生(Android 用 Jetpack Compose,iOS 用 SwiftUI/UIKit)。生产案例中,某餐饮 App 用 KMP 跑通了跨端支付,单份共享代码库月处理数百万笔交易。
// 共享层:纯 Kotlin 的业务逻辑,iOS/Android 各编一份
class CartRepository(private val api: ProductApi) {
suspend fun add(item: Product): Cart = withContext(Dispatchers.Default) {
api.addToCart(item.id).toCart() // 业务规则只写一次
}
}
对已有成熟 Kotlin 资产的团队,KMP 是"不改核心逻辑、渐进覆盖 iOS"的最顺滑路径。Swift 6 的编译期强制并发检查则把过去要上线才暴露的竞态,在构建阶段就拦下。
三、我们踩过的 5 个选型坑
3.1 坑一:把"代码复用率"当唯一指标
我们最初被"KMP 能复用 70% 代码"吸引,却忽略了一个事实:复用的是业务逻辑,不是 UI。电商 App 真正的差异化在首页动效、购物车交互、结算流畅度——这些恰恰是原生的。结果 KMP 项目里 UI 层仍然双份开发,复用率对体验毫无帮助。
💡 经验:复用率只该算"会变的业务规则",UI 一致性需求高的场景,Flutter 的端到端复用反而更省。
3.2 坑二:低估原生模块桥接成本
RN 项目里我们需要调用厂商推送 SDK 与原生扫码。New Architecture 下虽然类型安全,但每接一个原生能力就要写一份 TurboModule 胶水层,iOS/Android 各一份。三个月下来,桥接代码量超过了我们预估的两倍。
// 桥接层虽强类型,但仍需双端原生实现,别当作零成本
// ios/NativeScan.mm 与 android/NativeScan.kt 都要写
⚠️ 注意:凡是涉及系统级能力(推送、蓝牙、相机深度控制),三套方案都要写原生代码,跨平台省不掉这部分。
3.3 坑三:忽视团队基因错配
我们安卓组是 Kotlin 老手、iOS 组是 Swift 老手。强行推 KMP 后,iOS 同学要学 Gradle 与 Kotlin 协程,前两个月效率不升反降。框架适配团队,比团队适配框架更省钱。最终我们退回"KMP 共享纯逻辑 + 各自原生 UI"的最小形态,反而跑通了。
3.4 坑四:用低端机验收性能
Impeller 在高端机丝滑,但我们的一台 4 年旧安卓机首屏仍掉帧。根因不是 Flutter,而是我们没做图片分辨率分级 + 列表项回收。换用 cached_network_image 的渐进加载与 ListView.builder 后恢复流畅。
// 用 builder 构造列表,只渲染可视区,避免一次性建百个 widget
ListView.builder(
itemCount: products.length,
itemBuilder: (ctx, i) => ProductCard(products[i]),
);
3.5 坑五:把端侧 AI 当点缀
2026 年端侧 AI(Gemini 内嵌 Android、iOS 端侧框架)已成标配。我们起初把"智能搜索"做成云端调用,弱网下一律转圈。后来改用端侧轻量模型做本地联想、云端做重排,体验立刻不同。
💡 经验:App 若无视多模态/端侧输入,上线一年内就会显得过时。选型时要把"端侧推理 SDK 是否好接"算进框架评估。
四、一张决策表
| 维度 | Flutter | React Native | Kotlin Multiplatform |
|---|---|---|---|
| 渲染模型 | 自绘引擎 | 原生组件 + JSI | 原生组件(共享逻辑) |
| 代码复用 | UI+逻辑 高 | 逻辑为主 | 逻辑为主 |
| 性能(常规负载) | 接近原生 | 差距<8% | 原生 |
| 团队基因 | Dart 新学 | Web/JS | Kotlin 资产 |
| 端侧 AI 接入 | 插件生态 | 插件生态 | 原生直连最优 |
| 适合场景 | 品牌/动画强 | 快速迭代 | 已有 Kotlin 后端 |
一句话:品牌重、动画多、要一套代码覆盖移动+Web+桌面 → Flutter;团队本就是 React 栈、求快 → RN;已有成熟 Kotlin 资产、想渐进覆盖 iOS → KMP。
五、总结
跨平台不是"二选一"的信仰问题,而是业务速度、团队储备、平台手感的三角权衡。我们最终用"KMP 共享纯逻辑 + 各端原生 UI"跑通了电商主链路,把动效与端侧 AI 留给原生层。2026 年 Swift 6 的并发安全、Flutter 的 Impeller、RN 的 New Architecture 都在把"像原生"这件事做实——选错框架的代价在降低,但选错团队适配的代价一点没少。
觉得有用点个赞/收藏,评论区聊聊你家的跨平台选型故事。
更多推荐



所有评论(0)