一、Flutter介绍
1.1 什么是flutter?
Flutter是一款由 Google 开发供支持的跨平台开源框架。
在2018年发布时Flutter主要被用于移动端跨平台开发,Flutter3.0发布以后,支持在六个平台上进行应用程序开发:iOS、Android、Web、Windows、MacOS 和 Linux。
尽管多平台适配能力不断提升,iOS和Android仍是其核心应用场景:
-
移动端支持最成熟
-
社区资源最丰富
-
性能优化最彻底
本文也将以移动端视角展开讨论
Flutter无论从开发效率、性能表现,还是从企业成本的角度来看,Flutter 都提供了独特的解决方案。接下来我们来看一下为什么 Flutter 能够成为开发者的首选框架,以及它如何在实际项目中创造价值。
1.2 为什么要使用Flutter?
在传统的原生开发中,通常我们需要维护Android和iOS两个开发团队,导致版本迭代时的人力和测试成本加大。对一线的开发者来说,也许并不太关注这个问题。
但是,如果从公司的角度出发,有一套可以直接开发出Android的apk和iOS的代码,意味着公司只需要一个团队就能维护这套代码。这样就能在人力成本上节省开支。而在开发方面,这套代码能有效实现复用,简化测试,并统一UI风格。
而Flutter就是这样一个能帮我们实现跨平台开发的框架,它可以帮助你:
-
提高开发效率
-
同一份代码开发iOS和Android
-
用更少的代码做更多的事情
-
轻松迭代
-
在应用程序运行时更改代码并重新加载(通过热重载)
-
修复崩溃并继续从应用程序停止的地方进行调试
-
-
-
创建美观,高度定制的用户体验
-
受益于使用Flutter框架提供的丰富的Material Design和Cupertino(iOS风格)的widget
-
实现定制、美观、品牌驱动的设计,而不受原生控件的限制
-
(图片来自 Flutter中文网介绍)
Flutter 的这些优势不仅体现在技术层面,更在实际应用中得到了广泛验证。
随着越来越多的企业和开发者选择 Flutter,它在行业中的地位和影响力也日益凸显。
1.3 Flutter的地位和影响
“Apptopia 跟踪 Apple AppStore 和 Google Play Store 中的数百万个应用,并分析和检测哪些开发人员 SDK 用于创建这些应用,Flutter 是跟踪的最受欢迎的 SDK 之一:在 Apple AppStore 中 它的使用量从 2021 年所有跟踪免费应用的 10% 左右稳步增长到 2024 年所有跟踪免费应用的近 30%!
Flutter官方最新统计数据显示:
-
开发者基数:月活跃开发者突破100万大关
-
市场渗透率:支撑近30%新发布iOS应用(数据源: Apptopia Inc. )
-
社区规模:覆盖全球60+国家/地区,累计9万开发者参与本地社区活动
另外,根据行业调研显示,国内头部互联网企业已普遍将Flutter应用于核心业务场景:
字节跳动(今日头条)、腾讯(微信生态工具)、阿里巴巴(闲鱼)、美团等企业的关键产品线均已深度集成Flutter框架。这些技术选型决策印证了Flutter在实现高性能渲染、保持跨端UI一致性、支持动态化更新等核心能力上的技术优势。
(图片来自Flutter官网 showcase)
Flutter 的崛起并非偶然,而是移动开发技术演进的必然结果。要理解 Flutter 的价值,我们需要回溯跨平台技术的发展历程。这段进化史不仅揭示了技术发展的内在逻辑,也为我们理解 Flutter 的设计理念提供了重要背景。
二、跨平台的进化史
2.1 原生开发
原生开发作为移动开发的"黄金标准",其不可替代的核心优势主要体现在:
-
极致性能:极致流畅体验
-
渲染性能:直接调用Skia/Quartz 2D图形引擎,高帧率运行
-
线程优化:精细控制UI线程与后台线程,避免卡顿掉帧
-
内存管理:原生GC机制与平台深度集成,内存回收更及时
-
-
硬件支持:深度系统集成
-
新特性支持:直接支持5G/蓝牙5.0/NFC等硬件能力
-
传感器访问:精准获取陀螺仪、气压计等数据
-
相机控制:支持手动对焦、RAW格式等专业模式
-
权限管理:细粒度控制硬件访问权限
-
GPU加速:Metal/Vulkan图形API直接调用
-
然而,如果把移动开发比作造车,早期原生开发就像同时维护两条独立生产线——Android和iOS工程师如同分别制造燃油车和电动车,每个螺丝都要拧两遍。产品经理说:'这个动效Android和iOS能不能做得一模一样?' 就像要求油车和电车引擎声要同步轰鸣。
有一个典型痛点场景,当产品提出"修改全局圆角半径"需求时:
-
Android端需修改 res/values/dimens.xml
-
iOS端要调整 UIView.layer.cornerRadius 全局配置
-
两边各自测试+走查耗时 ≈ 2人日
这些痛点促使开发者们寻求更高效的解决方案,跨平台技术正是在这样的背景下应运而生,开启了移动开发的新阶段。
2.2 Web混合开发
当Android与iOS还在争夺移动市场时,Adobe的PhoneGap(后开源为Cordova)率先给出跨平台方案。PhoneGap是一个快速开发平台,允许开发者使用HTML、CSS和JavaScript等Web技术来创建跨平台的移动应用程序。这个方案的核心思路颇具巧思——将Web技术嵌入原生容器。其架构可拆解为三个关键层:
-
Web层:HTML/CSS构建界面,JS处理逻辑
-
桥接层:JsBridge实现双向通信
-
原生层:通过插件机制扩展设备能力
这套看似简单的架构,却带来了三重变革性优势
-
开发效率飞跃:复用Web技术栈,前端开发者转型使成本大幅降低
-
动态更新能力:服务端热更新HTML,紧急修复无需发版审核
-
跨平台一致性:统一CSS适配方案,双端UI差异率低
尽管PhoneGap/Cordova提供了跨平台的便利,但也面临一些性能上的挑战。
-
Android的WebView组件渲染效率相对较低
-
JavaScript作为解释型语言,其执行性能也不如编译型语言。这意味着在执行复杂任务时,性能可能会受到限制。
-
由于Android系统自身的内存管理问题,WebView在使用过程中消耗的内存无法在不需要时及时回收,这可能导致内存泄漏和最终的OOM。
因此,尽管PhoneGap/Cordova为跨平台开发提供了极大的便利,但在实际应用中仍需注意其性能瓶颈和内存管理问题,以确保应用的稳定性和用户体验。
这意味着需要更彻底的架构革新,而不是将Web嵌入原生,而是让原生组件能被动态编排。正是这种认知转变,为React Native的出现铺平了道路。
2.3 React Native
当WebView方案的性能天花板愈发明显时,Facebook在React Web框架大获成功的背景下,推出了移动端革命性方案——React Native(RN)。
在RN的工作机制中,开发者编写的仍然是JavaScript代码。这些代码首先被用来构建一个Virtual DOM,随后通过Bridge将这个虚拟DOM传递给原生层进行UI的创建和渲染。
这一流程与原生开发中的XML布局解析过程颇为相似:
-
在原生开发中,开发者编写XML布局文件,然后由Java对这些布局文件进行解析,并通过反射机制创建对应的视图组件。
-
而在RN中,这一布局配置任务由JS代码承担。
// JSX声明
<View style={styles.container}>
<Text>Hello World</Text>
</View>
// 实际映射过程
// Android端:
JS View → android.view.ViewGroup
JS Text → android.widget.TextView
// iOS端:
JS View → UIView
JS Text → UILabel
两种开发方式对比:
开发方式 | Android原生开发 | React Native |
UI编码 | XML布局文件 | JSX组件树 |
解析引擎 | LayoutInflater | Yoga布局引擎 |
组件创建 | 反射实例化View对象 | 映射为各平台的组件 |
更新机制 | 直接修改View属性 | 虚拟DOM Diff后批量通过Bridge更新 |
然而,与原生开发中的静态XML布局不同,RN中的UI更新需要通过Bridge再次进行数据传输。同样地,在RN中调用原生API也需要通过Bridge进行传递。这种频繁的跨桥调用无疑增加了通信成本,使得RN的性能无法完全媲美原生应用。这推动着跨平台技术向无桥接架构进化,而Flutter正是这个进化方向的终极答案...
2.4 Flutter
当React Native还在通过Bridge与原生组件交互时,Flutter选择了一条更彻底的技术路径。与RN类似,Flutter也旨在解决跨平台开发中的性能瓶颈和代码复用问题,但它采取了一种截然不同的策略——完全自主的渲染体系。
这种方案的核心在于:
-
语言革新:采用Dart语言,通过Dart虚拟机(DVM)实现JIT(即时编译)与AOT(预编译)的双模式支持,兼顾开发效率与运行性能。
-
渲染自主:基于高度优化的2D渲染引擎——Skia直接控制像素绘制,无需依赖平台控件,确保跨平台渲染一致性。
-
架构统一:从UI描述到渲染执行的全链路控制,DVM作为核心执行引擎,负责Dart代码的高效运行和资源管理。
Flutter采用清晰的两层架构设计:
-
Framework层
-
提供Widget、动画等开发接口
-
实现响应式编程模型
-
处理手势识别等交互逻辑
-
-
Engine层
-
Dart运行时环境(包含Dart VM)
-
Skia图形渲染引擎
-
平台通道等原生交互接口
-
Flutter的工作流程可概括为以下关键步骤:
-
UI开发:开发者使用Dart语言编写Widget树,定义界面结构和行为逻辑。这些代码会被编译为高效的中间表示形式(即DVM的字节码)。
-
渲染指令生成:Flutter引擎将Widget树转换为具体的渲染指令,包括布局计算、图层合成等操作。这一过程由Skia图形引擎执行硬件加速渲染。
-
平台适配:通过平台嵌入层将渲染结果适配到各平台的原生视图系统,同时处理输入事件和系统服务调用。这一层负责与Android的Surface、iOS的CALayer等原生图形接口对接。
Dart语言与Skia这一组合使得Flutter能够以一种几乎接近原生的方式,在iOS和Android平台上呈现UI界面,同时保持了代码的完全一致性和高效性。
总结
Flutter的出现是跨平台技术发展的必然结果。传统方案如React Native受限于Bridge的性能瓶颈,难以突破性能与体验的天花板。而Flutter通过创新的架构设计,在开发阶段利用JIT编译支持热重载,显著提升开发效率;在发布时通过AOT编译为原生机器码、无桥接架构实现媲美原生的运行性能。
从设计层面看,Flutter提供了完善的Widget体系,开发者可以轻松实现Material Design和Cupertino风格的UI效果,同时保持高度的定制灵活性。
作为Google官方力推的跨平台方案,Flutter拥有更规范的生态和更强的平台支持。这种官方背景不仅确保了技术的长期演进,也降低了因平台政策变动带来的风险(如iOS热更新限制)。
总之,Flutter 的出现为跨平台开发提供了一种不错的解决方案。它在开发效率、性能表现和跨端一致性之间找到了较好的平衡,同时通过丰富的组件库和活跃的社区支持,为开发者提供了更多可能性。随着技术的不断成熟,Flutter 正在成为跨平台开发领域的一个重要选择。