Flutter

Flutter 是由 Google 开发的开源 UI 框架,允许开发者通过单一代码库构建适用于移动端(iOS 和 Android)、Web、桌面端和嵌入式系统的原生编译应用。Flutter 于 2017 年首次发布,使用 Dart 编程语言,并提供丰富的可自定义组件库、高性能渲染引擎以及热重载功能,让开发者能够即时查看代码变更。如今,它已成为采用最广泛的跨平台框架之一,Google Pay、BMW、Alibaba、eBay 和 Nubank 等公司都在生产环境中使用它,以在各大主流平台提供一致的高性能体验。

什么是 Flutter?

Flutter 是 Google 提供的免费开源软件开发工具包(SDK),可通过单一共享代码库构建视觉效果丰富、原生编译的多平台应用。它于 2015 年首次以代号 “Sky” 发布,并于 2018 年 12 月推出稳定的 1.0 版本。此后,它已发展为一套完整工具包,支持六大平台——iOS、Android、Web、Windows、macOS 和 Linux——以及智能电视和车载显示屏等嵌入式设备。

Flutter

与依赖 WebView 或 JavaScript 桥接的传统跨平台工具不同,Flutter 使用自有渲染引擎自行绘制用户界面的每一个像素。你使用 Dart 编写的代码会直接编译为原生 ARM 或 Intel 机器码(Web 则编译为 JavaScript 和 WebAssembly),应用与操作系统之间没有中间解释器。最终性能接近完全原生的应用,同时你只需维护一套代码库。

由于 Flutter 是一套完整的 SDK,而不仅仅是一个 UI 库,因此它包含团队构建、测试和发布应用所需的一切:响应式框架、符合 Material Design 和 iOS Cupertino 规范的预构建组件、命令行界面、调试与性能分析工具,以及与 VS Code 和 Android Studio 等编辑器的集成。有关 SDK 实际包含哪些内容,请参阅我们关于 SDK 的术语表条目。

Flutter 如何工作:架构详解

Flutter 的架构由三个主要层级组成,它们协同工作,将你的 Dart 代码转换为可在任何受支持设备上运行的应用。核心理念是关注点分离:开发者几乎只在技术栈顶层工作,而底层则负责渲染和平台集成,不会将复杂性暴露到上层。正因如此,你可以编写一套 Dart 代码库,并让它在 iPhone、Pixel、Windows 笔记本电脑和 Web 浏览器上呈现完全一致的效果。

Flutter 架构 1

框架层(Dart)

技术栈顶层是完全使用 Dart 编写的 Flutter 框架。这是开发者日常直接交互的部分。它包含组件库、布局系统、动画基础组件、手势检测和状态管理基础。屏幕上的每个可见元素——从单个按钮到复杂的滚动列表——都是一个组件,组件通过组合形成树状结构,以声明式方式描述界面。由于框架使用的语言与开发者编写应用代码的语言相同,引擎之上的整个技术栈都可以被检查、调试,甚至重写。

引擎层(C++)

框架层下方是使用 C++ 编写、专为性能优化的 Flutter 引擎。引擎负责光栅化、动画、文本布局、无障碍支持和 Dart 运行时。Flutter 过去使用 Google 的 Skia 图形库;较新版本则配备名为 Impeller 的新引擎,可提升 iOS 和 Android API 29 及以上版本的渲染流畅度。引擎使 Flutter 应用能够在现代设备上以每秒 60 帧甚至 120 帧运行,也是动画感觉流畅而非卡顿的原因。

嵌入器层(平台特定)

嵌入器是 Flutter 与底层操作系统之间的桥梁。它使用各目标平台的原生语言编写——iOS 和 macOS 使用 Objective-C/Swift,Android 使用 Java/Kotlin,Windows 和 Linux 使用 C++,Web 使用 JavaScript。嵌入器负责启动应用、管理引擎绘制的表面、转发输入事件,并通过平台通道暴露相机、GPS、文件系统和推送通知等平台服务。这种分层设计还让 Google 能够在无需修改框架或引擎的情况下为 Flutter 添加新平台——只需新增一个嵌入器即可。

Flutter 的核心功能

多项技术决策让 Flutter 与其他跨平台框架不同。许多工具都承诺“编写一次,随处运行”,但 Flutter 实现这一承诺的方式——掌控渲染管线而非委托给原生组件——对性能、设计还原度和开发者体验有着重要影响。

最具特色的功能是组件系统。在 Flutter 中,一切皆为组件:文本、内边距、布局、动画,甚至应用本身。组件是对用户界面某一部分的不可变描述,它们可组合成树,并在底层状态变化时由 Flutter 高效重建。这种基于组合的模型避免了传统 Android 开发中经常导致性能问题的深层嵌套视图层级,同时让设计师和开发者能够精细控制屏幕上的每一个像素。

同样重要的是热重载,这常被认为是开发者回归原生开发时最怀念的功能。热重载利用 Dart 的即时编译器,在不到一秒内将代码变更注入正在运行的应用,而不会丢失当前导航或输入状态。开发者可以调整颜色、微调布局或修改业务逻辑,几乎立即看到结果,从而大幅缩短 UI 开发和修复 Bug 期间的反馈循环。

下表总结了开发者和产品团队最常提及的差异化功能。

功能含义
单一代码库一套 Dart 代码库可编译至 iOS、Android、Web、桌面端和嵌入式目标平台
热重载代码变更会在不到一秒内出现在运行中的应用中,且不会丢失状态
基于组件的 UI从布局到动画,一切都是可组合、可自定义的组件
原生编译Dart 可提前编译为原生 ARM、Intel、JavaScript 和 WebAssembly
Impeller 渲染引擎现代图形管线可减少卡顿,并支持流畅的高 FPS 动画
丰富的组件库Material Design 和 Cupertino 组件让应用在各平台上呈现原生外观
Pub.dev 生态系统数以万计的社区和官方软件包,几乎涵盖任何功能
由 Google 支持积极的开发路线图、完善的文档和庞大的全球社区

综合来看,这些功能解释了为什么 Flutter 越来越多地被用于那些设计质量和上市速度同等重要的应用。组件系统让设计师能够自由构建独特的界面,而无需与框架较劲;热重载消除了典型 UI 工作日中数小时的等待;原生编译则消除了早期跨平台工具备受批评的性能损失。

使用 Flutter 的优势

当团队希望在不将工程投入翻倍的情况下,在多个平台发布相同产品时,通常会选择 Flutter。其优势可分为两类:工程师能直接感受到的开发阶段优势,以及体现在预算、发布计划和产品指标中的业务层面优势。

在开发层面,热重载、统一代码库和强大的工具链共同让日常工作更快、更愉快。开发者可以在数小时而非数天内完成一个功能原型,而原本需要分别实现 iOS 和 Android 的设计变更,只需在一个地方完成。组件系统也让整个应用更容易贯彻一致的设计系统,从而减少视觉问题并缩短代码审查周期。

在业务层面,实际影响是可量化的。多项研究和案例报告表明,与维护两套原生代码库相比,团队通常可节省 20% 到 40%,具体取决于应用复杂度及其对平台专属功能的依赖程度。同样重要的是,上市时间缩短:团队无需配备并行的 iOS 和 Android 团队并同步发布节奏,单个 Flutter 团队即可同时推出两个版本。对于急于快速验证想法的初创公司和产品团队而言,这一点往往比其他所有考量都更重要。

下表总结了团队在说明为何选择 Flutter 时最常提到的主要优势。

优势重要原因
更快上市一个团队可同时发布 iOS 和 Android,通常能提前数周或数月上线
更低的开发成本与维护两套原生代码库相比,团队通常报告可节省 20% 到 40%
跨平台一致的 UIFlutter 自行渲染像素,因此设计在每台设备上看起来完全一致
接近原生的性能提前编译和 Impeller 引擎可提供流畅的动画效果
热重载提升效率开发者可实时迭代 UI,加快调试和设计审查
强大的工具和 IDE 支持提供适用于 VS Code 和 Android Studio 的一流插件,以及完整的 CLI 和 DevTools 工具套件
支持集成到现有应用Flutter 模块可逐步嵌入现有 iOS 或 Android 代码库

Add-to-app 值得特别一提,因为它消除了采用 Flutter 的最大障碍之一。已经维护原生 iOS 或 Android 代码库的团队无需重写所有内容,即可开始享受 Flutter 的优势。相反,他们可以使用 Flutter 实现单独的屏幕或功能模块,并将其嵌入现有应用;随着团队对框架建立信心,再逐步扩展。包括银行和电商平台在内的多家大型企业,都采用这种方式在数月或数年内迁移到 Flutter,而不是进行一次高风险的全面重写。

Flutter 的局限性

Flutter 并不适合每个项目。了解其取舍有助于团队判断它是否适合某个产品,以及哪些方面可能需要在 Flutter 代码库之外规划额外的原生开发工作。

最常被提及的局限性是应用体积。由于 Flutter 会将自有渲染引擎和框架运行时打包到每个发布版本中,一个“hello world”Flutter 应用比同等原生应用大数 MB。实际中,这很少会成为决定性问题——大多数生产应用本就比这一基准大一个数量级——但对于面向低端设备用户或存储空间有限用户的应用,值得尽早测量这部分额外占用。

第二点是 Dart 编程语言。Dart 设计良好,任何熟悉 Java、C# 或现代 JavaScript 的人都容易学习,并且非常适合构建用户界面。但它的使用范围不如与之竞争的语言广泛,这可能增加招聘难度,也意味着相比 JavaScript 或 Kotlin 等语言,Stack Overflow 答案和第三方教程更少。大多数团队会发现学习曲线较短,但高级 Flutter 工程师的招聘市场仍在发展,尤其是在主要科技中心以外。

第三个需要关注的领域是平台集成。Flutter 通过官方插件和 pub.dev 生态系统支持最常见的平台功能,但最新的 iOS 和 Android API 有时需要数周或数月才能封装为 Flutter 支持,而且少数高度专业化的功能仍可能需要平台特定代码。同样,这也适用于高级后台处理、深度硬件集成或特定企业 SDK 等小众使用场景。

局限性实际影响
应用体积较大与完全原生应用相比,打包的引擎和框架会使最终二进制文件增加数 MB
Dart 学习曲线Dart 的知名度低于 JavaScript、Kotlin 或 Swift
细分领域库有限部分高度专业化的原生 SDK 仍需要平台特定的桥接代码
较晚支持新的操作系统功能全新的 iOS 或 Android API 可能需要数周或数月才能封装为 Flutter 支持
Web SEO 挑战Flutter Web 最适合交互式应用,而不适合依赖 SEO 的内容网站
招聘市场仍在成熟高级 Flutter 工程师可能比经验丰富的原生开发者更难招聘

这些局限性没有一项是 Flutter 独有的——每种跨平台工具相较于完全原生开发都有取舍——但在决定采用前,仍值得与其优势进行权衡。对于大多数消费级应用,取舍明显更偏向 Flutter;而对于依赖前沿平台功能或深度硬件访问的应用,原生或混合方案可能更合适。

Flutter 与其他方案的比较

大多数考虑 Flutter 的团队都会将其与 React Native、Kotlin Multiplatform 和传统的完全原生开发进行比较。每个选项都代表了构建跨平台应用的不同理念,正确选择取决于团队最重视什么。

由 Meta 支持的 React Native 对 UI 采用了不同方法:它不自行绘制每个像素,而是将 React 组件映射为底层平台的原生 UI 基元。这意味着默认情况下各平台的外观会略有不同,有时这是理想的,有时却令人头疼。React Native 最大的优势是使用大多数 Web 开发者已熟悉的 JavaScript 或 TypeScript,因此更容易在 Web 和移动团队之间共享人才与代码。在这一比较中,Flutter 最大的优势是设计一致性和渲染性能。

Kotlin Multiplatform 则采取了另一条路径。它不共享 UI 层,而是专注于共享业务逻辑,同时让各平台的 UI 保持原生实现。这非常适合已经具备强大原生 iOS 和 Android 技能,并希望在不放弃原生 UI 控制权的前提下减少共享代码(网络、数据模型、业务规则)重复的团队。相较之下,Flutter 也共享 UI,开发速度更快,但意味着团队需要采用 Flutter 的渲染模型。

完全原生开发仍然是性能、深度平台集成以及在第一天即可使用全新 OS 功能的黄金标准。但它的成本也最高,因为每项功能都必须构建两次。可以将 Flutter 理解为:以约 50% 到 60% 的工程成本,获得 80% 到 95% 的原生体验。

标准FlutterReact Native原生
语言DartJavaScript 或 TypeScriptSwift 或 Kotlin
UI 渲染自有引擎,绘制每个像素映射至原生组件原生组件
性能Near-native采用新架构后接近原生同类最佳
覆盖的平台iOS、Android、Web、桌面端、嵌入式iOS、Android、Web、桌面端每个代码库对应一个平台
跨平台 UI 一致性默认完全一致略有平台差异按平台设计
平台间共享的代码最高可达 95%最高可达 90%
支持方GoogleMetaApple 和 Google

最后还要考虑每个框架的长期发展方向。过去几年中,Flutter 稳步从移动端扩展到 Web、桌面和嵌入式系统,Google 也已将旗下部分产品(最显著的是 Google Pay)迁移至 Flutter。React Native 在重构其核心架构后,已缩小了与 Flutter 之间长期存在的大部分性能差距。如需按功能逐项深入比较,请参阅我们关于 Flutter 与 React Native 以及 Flutter 与 Kotlin 的详细指南。

使用 Flutter 构建的公司和应用

Flutter 的采用范围早已超越初创公司和原型。许多全球品牌如今都使用该框架发布拥有数百万甚至数千万用户的生产应用,涵盖几乎所有行业——银行、电商、汽车、媒体、效率工具和健康。了解这些公司如何使用 Flutter,是理解该框架在生产环境中真正能力的最佳方式之一。

最有力的信号来自 Google 本身。Google Pay 是该公司使用最广泛的消费级产品之一,它通过 Flutter 重构,以统一 iOS 和 Android 代码库。该团队报告称,迁移后构建新功能所需的工程投入约为 1.2 倍,而不是为两个平台加倍——统一代码库也使维护变得显著更容易。BMW 也有类似的经历,它在超过 40 个市场的 My BMW 应用中使用 Flutter;Alibaba 的闲鱼二手交易平台则基于 Flutter 代码库,为中国数千万月活用户提供服务。

金融服务行业的采用同样值得关注,因为该行业对监管和可靠性标准要求很高。Nubank 是拉丁美洲最大的数字银行,拥有超过 8000 万客户,已将 Flutter 作为新产品开发的标准。Credit Agricole 和 ING 也已在欧洲推出 Flutter 银行应用。这些案例很重要,因为它们表明 Flutter 已达到那些传统上默认选择原生开发的行业标准。

公司行业Flutter 的使用方式
Google Pay金融科技经过重大重构后统一 iOS 和 Android 体验
BMW汽车面向驾驶者的 My BMW 应用和车载界面
Alibaba(闲鱼)E-commerce服务中国数千万用户的交易市场
eBay MotorsE-commerce通过单一代码库发布的垂直领域交易市场
Nubank银行业拉丁美洲最大的数字银行,服务 80M+ 客户
ByteDance媒体和工具用于 CapCut 和内部业务工具
Toyota汽车选择 Flutter 作为下一代车载信息娱乐系统的平台
Reflectly健康由两名工程师组成的团队为数百万用户打造跨平台日记应用

这些案例的共同点在于,Flutter 让团队在不牺牲质量的前提下更快推进。无论是 Google Pay 需要统一已逐渐分化的代码库,BMW 要向每位车主提供一致的品牌体验,还是 Reflectly 的两人团队实现远超其规模的成果,框架的价值都体现在交付速度和设计精致度上。不断增长的企业案例名单,也是分析师如今将 Flutter 描述为成熟的主流选择,而非实验性方案的原因之一。

何时选择 Flutter

Flutter 在一些明确的场景中表现出色。当单一产品需要在 iOS 和 Android 上呈现一致的外观和行为、交付速度优先,或 MVP 需要同时在多个平台验证想法时,它是强有力的选择。它也适合订阅应用、电商体验、金融科技产品和内容驱动型应用,在这些应用中,精致且可定制的 UI 比与特定平台的深度集成更重要。

对于严重依赖平台专属功能的应用(例如高级 ARKit 体验、复杂的 Apple Watch 表盘复杂功能,或底层音频和蓝牙处理),或者对 SEO 至关重要的网站,Flutter 的适配性较弱。在这些情况下,原生开发或混合方案可能更适合您。您可以在我们对 移动应用开发框架 的概述中找到更全面的比较。

Flutter 和应用内购买

由于 Flutter 通过一套代码库同时支持 iOS 和 Android,订阅和应用内购买变现需要适配两套完全不同的计费系统:Apple 的 StoreKit 和 Google 的 Play Billing Library。团队主要有两种选择。

第一种是由 Flutter 团队维护的官方 in_app_purchase 插件。它让您可以直接访问两个应用商店的 API,但收据验证、订阅状态跟踪、退款处理和分析功能仍需由您自行构建和托管。第二种是像 Adapty Flutter SDK 这样的托管解决方案,它通过单一 API 封装两个应用商店,并开箱即用地处理服务端验证、付费墙配置、A/B 测试和收入分析。若要查看包含代码示例的两种方案完整指南,请参阅我们的 Flutter 应用内购买教程

常见问题

是的。Flutter 在 BSD 风格许可证下完全开源,可免费用于任何商业或个人项目。您可以从 flutter.dev 下载 SDK,无需支付许可费用。

Flutter 使用 Dart,这是一种由 Google 设计的面向对象语言。Dart 是静态类型语言,支持即时编译以加快开发周期,也支持提前编译为原生机器码以用于生产环境。您可以在 dart.dev 了解更多信息。

从技术上说,Flutter 是一套完整的软件开发工具包。它包含 UI 框架、渲染引擎、Dart 编译器和运行时、CLI、调试工具以及平台嵌入器。“Flutter 框架”一词通常被非正式地用于指开发者直接交互的 Dart 层库。

Flutter 目前将 iOS、Android、Web、Windows、macOS 和 Linux 作为稳定目标平台,同时还额外支持智能电视、车载显示屏和 IoT 设备等嵌入式系统。

两者没有绝对的优劣。Flutter 通常提供更一致的跨平台 UI、更广泛的平台覆盖和提前编译;而 React Native 允许你使用 JavaScript 和 TypeScript,拥有更深厚的面向 Web 开发者生态,并且能更自然地与现有原生组件集成。正确选择取决于团队技能、设计目标和平台组合。

是的。Flutter 同时支持 Apple 的 StoreKit 和 Google 的 Play Billing Library,既可以通过官方 in_app_purchase 插件,也可以通过 Adapty 等托管解决方案;后者提供服务端收据验证、付费墙配置、A/B 测试和收入分析。

你无需了解 Swift、Kotlin、Objective-C 或 Java 即可发布 Flutter 应用,但了解 iOS 和 Android 平台的行为方式(如生命周期、权限和计费规则),仍有助于你发布到应用商店并处理边缘情况。

具有任意面向对象语言经验的开发者通常可在两到四周内使用 Flutter 高效开发。框架的热重载、丰富文档和庞大社区,使其学习曲线比在两个平台上进行完全原生开发显著更短。

可以。Google Pay、BMW、Alibaba、Nubank 和 Toyota 等公司都在生产环境中运行关键任务型 Flutter 应用。CTO 和技术负责人的调查持续显示,他们对 Flutter 满意度很高,并且强烈愿意将其推荐用于新项目和迁移项目。

不支持。热重载是一项开发阶段功能,使用 Dart 的即时编译器。出于性能和安全考虑,生产构建会提前编译为原生机器码。
目录