01|Flutter 干脆不想再借宿主了

主线第三篇写到 React Native 时, 整条跨端线已经有了一个非常现代、也非常成熟的姿态:

  • 承认宿主重要
  • 承认差异不会消失
  • 尽量共享逻辑和心智
  • 把视图解释权交还给原生控件

这条路当然很强。

可它也留下了一个很明显的老问题:

只要 UI 最终还是要靠宿主控件解释,你就永远活在宿主差异、桥接映射和平台实现细节的阴影里。

这就是 Flutter 真正切进来的位置。

它没有说:

“我也来做一套更好的宿主控件映射。”

它更像是在直接换题:

既然宿主控件这层解释总在制造差异,那为什么不把这层解释权直接拿回来?

于是 Flutter 的答案变成了:

  • UI 我自己画
  • 布局我自己管
  • 渲染我自己控
  • 平台只负责提供窗口、输入、系统能力和嵌入环境

这一步为什么重要?

因为它代表现代跨端最关键的一次哲学分叉:

一条路线说“借宿主”。

另一条路线说“别再把 UI 交给宿主解释”。


02|它非得把一致性攥回自己手里

很多人后来第一次接触 Flutter, 最容易记住的是这些表面印象:

  • Dart
  • Widget
  • 热重载
  • 动画丝滑

这些当然都重要。

可如果只停在这里, 你会把它写浅。

Flutter 真正厉害的地方, 不是“再来一套开发框架”。

它真正厉害的地方是:

它主动拒绝把跨端一致性继续押在宿主控件上。

你去看 Flutter 官方架构总览和 Inside Flutter, 它最稳定的一条心智就是:

  • Flutter 是分层系统
  • 核心有自己的一整套 engine
  • framework 负责组件、布局和状态映射
  • engine 负责把 scene 真正 rasterize 出来

这说明什么?

说明它根本不满足于:

“把 JavaScript 或 Dart 逻辑映射到现成原生控件。”

它想要的是:

一套自己能完整控制的渲染链路。

这和 React Native 的现实主义不一样。

React Native 的现实主义是:

差异别硬抹,借宿主来换平台感。

Flutter 的现实主义则是:

既然宿主差异这么麻烦,那统一体验最可靠的方式,也许不是更努力地映射,而是少映射。


03|它真正值钱的,是渲染控制权

很多跨端技术最后卖的都是效率。

Flutter 当然也卖效率。

可它的真正吸引力其实更硬:

它卖控制权。

什么控制权?

  • 同一套布局语义
  • 同一套绘制结果
  • 同一套动画路径
  • 同一套组件行为

这一步特别关键。

因为当你自己掌握渲染链路时, 你就不必再像很多宿主映射路线那样, 长期和这些问题缠斗:

  • 某个平台控件行为不一致
  • 某个版本原生组件细节改了
  • 某个动画在一端顺、另一端卡
  • 同样的设计稿在不同宿主上总有细碎偏差

也就是说, Flutter 真正想买下来的, 不是抽象意义上的“一套代码”而已。

而是:

一套更可预测的视觉和交互结果。

这就是为什么它特别容易打动那类很在乎:

  • 复杂 UI
  • 品牌一致性
  • 动效质量
  • 自定义界面

的团队。

因为对他们来说, 宿主控件不是恩赐。

很多时候反而像限制。


04|不借宿主了,它又把代价搬去了哪里?

Flutter 时最容易犯的错误, 就是把它写成:

“终于有一个方案不用受宿主控件折磨了,所以它更先进。”

这种写法会很浅。

因为 Flutter 没有消灭代价。

它只是换了一种交法。

以前你在 React Native 那里更常撞上的, 是:

  • 宿主控件差异
  • 中间映射复杂度
  • 桥接性能问题

而到了 Flutter, 更多代价会变成:

  • 引擎体积
  • 渲染链路自己维护
  • 平台拟合工作转到 engine / embedder
  • 生态和插件要补宿主能力接缝

换句话说, Flutter 不是把复杂度蒸发了。

它是把复杂度从:

“怎么把自己映射进宿主”

改成了:

“怎么自己带着一整套渲染系统稳定地跑在宿主上”

这也是为什么它虽然看起来更统一, 却不代表它更轻。

它统一的是结果, 不是成本。


05|性能在 Flutter 这里格外像生死线

Flutter 这条线特别适合写性能, 因为它的哲学本身就和性能纠缠得很深。

它不是简单“跑得快”这么朴素。

它更像是在赌:

自己掌握整条渲染链路之后,能不能换来更稳定、更可预测的高性能界面。

所以它特别重视:

  • 帧稳定性
  • 动画一致性
  • shader 编译问题
  • 首帧与复杂 UI 的表现

后来 Impeller 的出现就很说明问题。

官方把它定义成新的 rendering runtime, 强调的是:

  • predictable performance
  • shader build-time 预编译
  • 减少运行时 shader stutter

这说明什么?

说明 Flutter 自己也非常清楚:

一旦你把“自己控制渲染链路”当成卖点,你就必须对渲染链路里的每一笔性能账负责。

这和 React Native 新架构后来去拆桥接瓶颈, 其实是同一条历史逻辑。

只不过 Flutter 这里最敏感的战场不在 bridge。

而在 engine。


06|回头看,Flutter 真在跟谁分道扬镳?

回头看 Flutter, 最不该只记住的, 不是它支持多少平台。

更该记住的是这句:

Flutter 真正想解决的,不只是跨端效率,而是宿主控件这层旧妥协。

它真正和别家分道扬镳的地方, 不在于 Dart,甚至也不只在于 engine。

而在于它对那套老妥协已经不耐烦了:

既然每次跨端都要在宿主控件映射上反复吃亏, 那为什么还要继续把 UI 命运交给宿主解释?

所以 Flutter 的野心, 从来不只是“再多一个跨端框架”。

它更像是在直接改写赛题:

真正烦人的也许不是多端本身,而是你的界面总得先经过别人的控件体系重新翻译一遍。


编者注(事实核对):文中关于 Flutter 分层架构、engine 与 framework 分工、自绘渲染路线,主要依据 Flutter 官方文档 Flutter architectural overviewInside Flutter。关于 Impeller 作为新 rendering runtime、强调 predictable performance 和 build-time shader preparation,主要依据 Flutter 官方 Impeller 文档。


参考与延伸阅读

  1. Flutter architectural overview
    https://docs.flutter.dev/resources/architectural-overview

  2. Inside Flutter
    https://docs.flutter.dev/resources/inside-flutter

  3. Impeller rendering engine
    https://docs.flutter.dev/perf/impeller