flutter:main方法启动的时候flutter都干了什么

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 更新

总结: 整个启动流程可以概括为:

  1. Flutter 引擎启动
  2. Dart 执行 main()
  3. runApp() 调用 → Binding 自动创建
  4. 挂载 Widget 树 → 调度渲染 → 构建布局
  5. 首帧绘制完成 → Scheduler 开始帧刷新循环

×

喜欢就点赞,疼爱就打赏