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 是否好接"算进框架评估。

四、一张决策表

维度FlutterReact NativeKotlin Multiplatform
渲染模型自绘引擎原生组件 + JSI原生组件(共享逻辑)
代码复用UI+逻辑 高逻辑为主逻辑为主
性能(常规负载)接近原生差距<8%原生
团队基因Dart 新学Web/JSKotlin 资产
端侧 AI 接入插件生态插件生态原生直连最优
适合场景品牌/动画强快速迭代已有 Kotlin 后端

一句话:品牌重、动画多、要一套代码覆盖移动+Web+桌面 → Flutter;团队本就是 React 栈、求快 → RN;已有成熟 Kotlin 资产、想渐进覆盖 iOS → KMP。

五、总结

跨平台不是"二选一"的信仰问题,而是业务速度、团队储备、平台手感的三角权衡。我们最终用"KMP 共享纯逻辑 + 各端原生 UI"跑通了电商主链路,把动效与端侧 AI 留给原生层。2026 年 Swift 6 的并发安全、Flutter 的 Impeller、RN 的 New Architecture 都在把"像原生"这件事做实——选错框架的代价在降低,但选错团队适配的代价一点没少

觉得有用点个赞/收藏,评论区聊聊你家的跨平台选型故事。

Logo

一站式 AI 云服务平台

更多推荐