Flutter — 关键概念、架构与部件

作者: IT Sectr 发布日期: 2026-05-01 阅读时间: 8 分钟

Flutter 是谷歌推出的开源框架,用于从单一的Dart语言代码库创建跨平台应用程序。根据 Flutter Documentation, 2024,该框架可编译为iOS、Android、Web、Windows、macOS和Linux的原生代码,在所有平台上提供相同的UI行为,无需使用WebView或JavaScript桥接。

要点

  • Flutter — 谷歌推出的跨平台开发框架,使用Dart语言
  • 架构的基础是部件:所有界面元素都是不可变的Widget对象
  • Flutter使用自己的Impeller渲染引擎(此前为Skia),消除了对原生UI组件的依赖
  • Hot Reload(热重载)可在毫秒内看到代码中的变化
  • 支持6个平台:iOS、Android、Web、Windows、macOS、Linux

什么是Flutter

Flutter是一个用于创建用户界面的SDK(软件开发工具包)和框架,由谷歌于2015年发布。首个稳定版本Flutter 1.0于2018年12月发布。与React Native不同,Flutter不使用JavaScript与原生代码之间的桥接——它直接编译为处理器的原生指令。

Flutter的关键特性是其自有渲染引擎。该框架不依赖于UIKit(iOS)或Android的View系统。相反,Flutter通过Skia(截至2024年)或新的Impeller引擎独立绘制每个像素。这保证了应用在所有平台上具有一致的外观,并消除了适应不同操作系统版本的问题。

根据Statista 2024的数据,Flutter在跨平台框架中 popularity 排名第一:约46%的开发者将其用于移动开发。该框架应用于Google Pay、Alibaba、eBay、BMW和Tencent等项目中。

Flutter的历史与版本

首个Flutter alpha版本于2015年在Dart开发者峰会上以Sky为名亮相。2018年发布了仅支持iOS和Android的Flutter 1.0。Flutter 2.0(2021年)增加了Web和Desktop支持。Flutter 3.0(2022年)引入了对macOS和Linux的稳定支持。Flutter 3.16(2023年)推出了Impeller——基于Metal和Vulkan的新渲染引擎。

Flutter 3.22版本(2024年)在iOS上默认启用Impeller,改进了对Material Design 3的支持,Dart 3.4引入了宏扩展,并内置了对Native Assets的支持,可直接访问平台资源。谷歌报告称,与Skia相比,Impeller将帧丢失(jank)降低了90%。

Dart语言

Dart是由谷歌于2011年创建并在Flutter中使用的编程语言。Dart将严格类型化与JIT编译(用于Hot Reload)和AOT编译(用于生产构建)的能力相结合。Dart 3.0(2023年)引入了pattern matching、sealed class和records作为稳定功能。

Null safety(空安全)——从2.12版本引入的强制功能。编译器在构建阶段检查所有可空类型,在运行时消除了NullPointerException。数据类型(int、String、bool)默认为非空,可空值使用后缀?(例如String? name)。

Flutter架构

Flutter架构基于三层原则构建。底层——引擎(C/C++),负责渲染、输入/输出和访问平台API。中间层——框架(Dart),实现部件、手势、动画和导航系统。顶层——应用程序(Dart),将部件组合成树状结构。

部件与部件树

Flutter中,一切都是部件。部件分为两种类型:StatelessWidget(不可变,不存储状态)和StatefulWidget(可变,通过State管理状态)。部件树(Widget Tree)是一种层次结构,每个子部件嵌套在父部件中。Scaffold、AppBar、Container、Text、Column、Row——基本构建块。

BuildContext是一个传递部件在树中位置的对象。MediaQuery.of(context)获取屏幕尺寸,Theme.of(context)获取当前主题。BuildContext用于导航(Navigator.of(context))、访问InheritedWidget以及通过Localizations.of进行本地化翻译。

Impeller引擎

Impeller是现代的Flutter渲染引擎,使用C++编写,并采用Metal(iOS/macOS)和Vulkan(Android)。与从头重新绘制每一帧的Skia不同,Impeller提前编译着色器并将其存储在缓存中。这消除了复杂场景首次渲染时的延迟,并降低了GPU负载。

谷歌Flutter团队的测试表明,Impeller将着色器编译时间从200–500毫秒(Skia)缩短至1–3毫秒。在iPhone 13 Pro上,Impeller渲染可达120 FPS,无帧丢失。在搭载Vulkan的Android设备上,即使是中端设备(如Xiaomi Redmi Note 12)也能稳定达到60 FPS。

Flutter应用示例

dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Flutter应用')),
        body: const Center(
          child: Text('你好,Flutter!'),
        ),
      ),
    );
  }
}

Flutter的优势

统一代码库——Flutter的主要优势。一个Dart项目可编译为iOS、Android、Web、Windows、macOS和Linux。据谷歌估计,与独立的iOS和Android项目相比,这可将开发时间缩短30%–50%。阿里巴巴在改用Flutter后,版本发布周期缩短了30%。

性能方面,Flutter接近原生。Dart的AOT编译为ARM和x86_64机器代码消除了解释延迟。Impeller引擎即使在2018年的设备(iPhone XR、Samsung Galaxy S9)上也能保证60 FPS。据谷歌称,Flutter应用中99.5%的帧渲染无丢失。

Hot Reload(热重载)——即时代码更新技术。开发者修改源代码、保存文件后,Flutter可在300–800毫秒内重建部件树,且不丢失当前应用状态。这加速了UI设计迭代:可以在几秒内调整边距、颜色和动画,无需等待完全重建。

Material Design 3以及自有的Cupertino设计语言(iOS风格)都包含在Flutter标准发行版中。Material 3部件支持动态颜色(Material You)、自适应布局和屏幕间过渡动画。CupertinoPageTransition和CupertinoNavigationBar模拟了原生iOS导航器的行为。

部件定制无需在每个平台上创建自定义View。只需重写build()并返回新的部件。animation(AnimatedContainer、Hero、TweenAnimationBuilder)和gesture(GestureDetector、Dismissible)包覆盖了95%的UI动画场景,无需编写平台代码。

Flutter生态系统与包

pub.dev——Dart和Flutter的官方包注册中心。截至2024年7月,注册中心已发布超过45,000个包。包安装通过flutter pub add <包名>命令完成。Pub自动解析依赖关系,检查版本兼容性并生成pubspec.lock文件。

Flutter中的状态管理——关键的架构任务之一。除了flutter_bloc,流行的解决方案还有:Provider(谷歌推荐,使用InheritedWidget)、Riverpod(Provider的改进版,具有编译时安全性)和GetX(一体化:状态、路由、依赖注入)。Provider仍然是初学者最简单的方式:ChangeNotifierProvider包装模型,Consumer在数据变化时重新绘制部件。

Flutter中的测试在三个层面得到支持。单元测试(flutter test)检查无UI的函数和类。部件测试(testWidgets)在隔离环境中渲染单个部件。集成测试(IntegrationTest)在设备或模拟器上运行完整应用。Flutter 3.22增加了通过补丁分析和改进的代码覆盖率报告对补丁测试的支持。

流行包

dio——支持拦截器、超时和FormData的HTTP客户端。在GitHub上40%的Flutter项目中使用。Dio支持拦截请求以进行日志记录、重试和添加授权令牌。第二大流行的库是retrofit,可生成类型化的API客户端。

flutter_bloc——基于BLoC(业务逻辑组件)模式的状态管理库。BlocProvider沿部件树向下传递状态,BlocBuilder在状态变化时重新绘制UI,BlocListener执行副作用(导航、SnackBar)。Cubet——不带事件的简化版BLoC。

go_router——谷歌为Flutter提供的声明式导航。路由在GoRouter配置中描述,支持嵌套路由、重定向和深度链接。ShellRoute将导航分割为BottomNavigationBar的标签页。GoRouter 14.0支持类型安全路径和保持标签页状态的StatefulShellRoute。

月安装量用途
dio1200万+带拦截器的HTTP客户端
flutter_bloc800万+状态管理(BLoC)
go_router500万+声明式导航
firebase_core1000万+Firebase集成

常见问题

Flutter使用哪些语言?

Flutter使用Dart语言。Dart 3.x版本支持空安全、模式匹配、密封类和记录。Flutter引擎使用C/C++编写,但开发者仅使用Dart编写应用。此外,还可以使用平台通道(Platform Channels)来调用Swift/Kotlin代码。

Flutter比React Native更好吗?

选择取决于项目。Flutter凭借AOT编译和自有渲染引擎提供了更高的性能。React Native提供了庞大的JavaScript生态系统访问权限,并允许使用现有的Web代码。Flutter在帧率方面领先,React Native在现成库数量方面领先。

Flutter可以用于Web开发吗?

可以。Flutter for Web将Dart编译为JavaScript/DOM或WebAssembly。Web版本支持自适应布局、路由和自定义Canvas元素。但对于复杂的SEO需求,由于缺乏服务器端渲染和原生HTML,Flutter Web不如传统的React/Vue项目。

什么是FlutterFlow?

FlutterFlow是一个用于可视化创建Flutter应用程序的低代码平台。开发者通过拖拽构建UI,通过可视化编辑器配置逻辑,并导出准备好的Dart代码。FlutterFlow用于原型设计和简单应用,但在定制方面不如手写代码。

哪些大公司使用Flutter?

谷歌在Google Pay、Google Classroom和Google Nest中使用Flutter。其他大型项目包括——阿里巴巴(拥有1亿用户的闲鱼应用)、eBay(移动应用)、BMW(iDrive界面)、腾讯(起点)和丰田(信息娱乐系统)。

总结

  • Flutter — 谷歌推出的跨平台开发框架,使用Dart语言,支持6个平台
  • 自有Impeller渲染引擎提供60–120 FPS,无帧丢失
  • 部件是架构的核心——StatelessWidget和StatefulWidget覆盖所有UI场景
  • Hot Reload加速开发:更改在300–800毫秒内可见,无需重启应用
  • pub.dev生态系统拥有45,000+个包,涵盖HTTP、导航、状态管理和Firebase
  • Dart的AOT编译提供与原生应用相当的性能
  • 为MVP、跨平台项目和自定义UI应用选择Flutter

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读