Skip to content
导航

Flutter

Flutter 不属于Web前端的知识点,这里提及 Flutter 只是为了纠正对 Flutter 的错误认知,不要在错误的选型上花费更多时间精力。

在前端 All in JS 的今天,Flutter绑定Dart语言,完全不兼容前端生态。因此尽管前端界来来去去很多人提起或推崇过Flutter,都不见起色,最终沉寂。

客户端开发适合Flutter,可以嵌入现有的APP中。我的客户端开发同事也说过,前端开发者不容易上手Flutter,相比客户端开发者没有优势。

Flutter 架构概览

Flutter 架构概览

Flutter 是一个跨平台的 UI 工具集,它的设计初衷,就是允许在各种操作系统上复用同样的代码,例如 iOS 和 Android,同时让应用程序可以直接与底层平台服务进行交互。

本文只了解下 Flutter 的渲染模型:

Flutter 如何提供与原生平台框架相当的性能?

通常来说,跨平台框架(如 React Native、小程序)都会在 Android 和 iOS 的 UI 底层库上创建一层抽象,该抽象层尝试抹平各个系统之间的差异。应用程序的代码常常使用 JavaScript 等解释型语言来进行编写,这些代码会与基于 Java 的 Android 和基于 Objective-C 的 iOS 系统进行交互,最终显示 UI 界面。所有的流程都增加了显著的开销,在 UI 和应用逻辑有繁杂的交互时更为如此。

相比之下,Flutter 通过绕过系统 UI 组件库,使用自己的 widget 内容集,削减了抽象层的开销。用于绘制 Flutter 图像内容的 Dart 代码被编译为机器码,并使用 Skia 图像引擎进行渲染。 Flutter 同时也嵌入了自己的 Skia 副本(未来会迁移到 Impeller),让开发者能在设备未更新到最新的系统时,也能跟进升级自己的应用,保证稳定性并提升性能。

根据以上描述,与 React Native 对比如下

角度React NativeFlutter比较结果
UI抽象JavaScript → Java / Objective-C → 系统 UI 组件库Dart → 系统 UI 组件库✔削减了抽象层的开销
编译JavaScript 即时编译Dart 代码预编译为机器码✔代码运行效率高
渲染引擎系统图像引擎Skia 图像引擎(未来会迁移到 Impeller)✔跨平台
系统兼容性兼容Android、iOS(第三方扩展 Web 等平台)的部分UI组件、功能,支持撰写双端平台代码兼容几乎全平台,支持撰写双端平台代码✔兼容性好
产物体积含 JavaScript 解释器含机器码、图像引擎❌随功能增加,代码体积增速快

题外话:什么是错误的选型

需求

跨平台开发,需要使用平台原生能力,而浏览器不支持。

错误的选型

因为 Flutter 跨平台,性能好,有前端开发者捧,所以遇到原生开发需求,提议使用Flutter。

正确的选型

如果客户端开发者、有经验的Flutter开发者资源充足的话,一开始就选择Flutter框架也不错。
否则使用JavaScript跨平台框架,需求迭代效率会更高。

Flutter 作为跨平台框架,不是必选项,所有功能都可以使用原生开发来实现。
只有遇到性能问题才需要考虑:解决性能问题的成本高,还是将遇到性能问题的这部分内容迁移到Flutter技术栈的成本高?

在团队具备Flutter的清晰认知后,再考虑当前业务产品迁移Flutter有哪些收益,是否值得做出行动。