void main() async {
runApp(MyApp());
}
就以上代码,main方法启动的时候flutter都干了什么
sequenceDiagram participant Dart as Dart层 main() participant Engine as Flutter引擎 participant Binding as WidgetsFlutterBinding participant Framework as Widget框架 Dart->>Engine: 启动Flutter引擎,初始化Dart VM Dart->>Dart: 执行 main() Dart->>Binding: runApp(MyApp()) note right of Binding: 确保Binding存在
(如果未初始化,会创建WidgetsFlutterBinding) Binding->>Framework: 挂载根Widget(MyApp) Framework->>Binding: 调度渲染、事件、Scheduler Binding->>Engine: 连接渲染管线、绘制首帧 Framework->>Framework: Widget树构建和布局 Binding->>Engine: 绘制完成,显示首帧
1️⃣ Dart->>Engine: 启动Flutter引擎,初始化Dart VM
- 发生层:Flutter 引擎(C++ 层)
- 作用:
- 初始化 Dart 虚拟机 (Dart VM)
- 准备渲染管线(Skia)、GPU 通道
- 初始化事件通道(手势、输入事件)
- 说明:这是 Flutter 程序运行的底层基础,保证 Dart 代码和 UI 渲染可以执行。
2️⃣ Dart->>Dart: 执行 main()
- 发生层:Dart 层
- 作用:
- 执行程序入口
main()
- Dart 层开始掌控程序逻辑
- 执行程序入口
- 说明:此时 Flutter 的 Widget 树和 Binding 还未创建,Dart 层可以自由初始化变量或调用插件(前提是 Binding 已经初始化)。
3️⃣ Dart->>Binding: runApp(MyApp())
- 发生层:Dart 层调用 Flutter 框架 API
- 作用:
- 启动 Widget 框架
- 将你的根 Widget(
MyApp
)挂载到根元素
- 说明:
runApp()
会自动调用WidgetsFlutterBinding.ensureInitialized()
,确保 Binding 存在- 如果 Binding 尚未创建,这里会主动创建一个
WidgetsFlutterBinding
实例。
4️⃣ note right of Binding: 确保Binding存在 (如果未初始化,会创建WidgetsFlutterBinding)
- 发生层:Binding 层
- 作用:
- Binding 是 Dart 层和 Flutter 引擎之间的桥梁
- 管理:
- Scheduler(帧调度)
- Gesture/事件处理
- 渲染 Pipeline
- 说明:有了 Binding,插件和 Widget 才能安全使用平台通道和事件调度。
5️⃣ Binding->>Framework: 挂载根Widget(MyApp)
- 发生层:Flutter 框架层
- 作用:
- 创建 Widget 树的根节点
- 开始构建 Widget 树(
Element
树和RenderObject
树)
- 说明:
MyApp
会调用build()
方法,递归生成子 Widget。
6️⃣ Framework->>Binding: 调度渲染、事件、Scheduler
- 发生层:Binding 调度层
- 作用:
- 注册 FrameCallback,用于每帧 UI 的渲染
- 处理事件调度(如手势、输入事件)
- 处理 Widget 生命周期回调(
initState()
、didChangeDependencies()
等)
- 说明:Binding 和 Scheduler 协作保证 UI 能够每帧刷新。
7️⃣ Binding->>Engine: 连接渲染管线、绘制首帧
- 发生层:Binding → Flutter 引擎
- 作用:
- 将
RenderObject
树翻译为 Skia 绘制指令 - 提交给 GPU 渲染首帧
- 将
- 说明:这是 UI 第一次显示在屏幕上的操作。
8️⃣ Framework->>Framework: Widget树构建和布局
- 发生层:Flutter 框架
- 作用:
- Widget 树 → Element 树 → RenderObject 树
- 执行布局(
layout
)和绘制(paint
)
- 说明:
build()
方法被调用- 生成所有子 Widget 的布局信息
- 生成渲染对象(RenderObject)
9️⃣ Binding->>Engine: 绘制完成,显示首帧
- 发生层:Binding → Flutter 引擎
- 作用:
- Skia 完成渲染
- Flutter 引擎将首帧画面显示到屏幕
- 说明:
- 这标志着 Flutter App 启动完成,用户可以看到 UI
- Scheduler 开始每帧调度,支持后续 UI 更新
总结: 整个启动流程可以概括为:
- Flutter 引擎启动
- Dart 执行 main()
- runApp() 调用 → Binding 自动创建
- 挂载 Widget 树 → 调度渲染 → 构建布局
- 首帧绘制完成 → Scheduler 开始帧刷新循环