返回

Flutter之UI架构的启动过程(11)

前端

在上一篇文章中,我们介绍了Android系统调用Engine:Run方法的过程,最终调用到Flutter UI层中的main()函数,FlutterUI框架开始初始化。Flutter Engine初始化过程中已经把Window对象初始化完成并且和Engine相关连,Flutter Engine就根据这些相关连的信息去设置Flutter UI相关的对象。

1. Framework相关初始化:

在main函数中,通过runApp()函数来启动Flutter应用,runApp()函数内部会进行Flutter UI框架相关的初始化,主要是以下几个步骤:

  1. 创建Flutter Widgets库顶层父节点,一个名为App的Widget,用于存放所有的子Widget。

  2. 创建一个BindingBase的对象,该对象是一个管理Flutter应用生命周期的抽象类。

  3. 创建一个WidgetsBinding对象,它是BindingBase的一个实现类,负责管理Flutter应用的Widget树。

  4. 通过runApp函数将App Widget添加到WidgetsBinding的Widget树中,并启动Flutter应用。

2. 渲染初始化:

在WidgetsBinding的initInstances函数中,Flutter UI框架会进行渲染相关的初始化,主要是以下几个步骤:

  1. 创建一个RendererBinding对象,该对象负责管理Flutter应用的渲染过程。

  2. 创建一个RenderView对象,该对象是渲染树的根节点。

  3. 将RenderView对象添加到RendererBinding的渲染树中。

  4. 创建一个CompositorContext对象,该对象负责管理Flutter应用的合成过程。

  5. 创建一个SceneBuilder对象,该对象负责将渲染树转换为场景。

  6. 创建一个Scene对象,该对象是渲染树的最终表示形式。

3. 构建Widget树:

在main函数中,通过runApp()函数启动Flutter应用后,Flutter UI框架会开始构建Widget树。Widget树是Flutter应用用户界面的抽象表示,它由一组嵌套的Widget组成。

构建Widget树的过程是通过Element来完成的。Element是Widget在运行时的表示,它包含了Widget的状态信息和渲染信息。

Flutter UI框架会根据App Widget创建根Element,然后根据根Element创建子Element,依次构建出整个Widget树。

4. 布局和绘制:

Widget树构建完成后,Flutter UI框架会进行布局和绘制的过程。布局过程是确定Widget在屏幕上的位置和大小,绘制过程是将Widget渲染到屏幕上。

布局和绘制的过程是通过RenderObject来完成的。RenderObject是Widget的具体实现,它包含了Widget的布局和绘制逻辑。

Flutter UI框架会根据Widget树创建根RenderObject,然后根据根RenderObject创建子RenderObject,依次构建出整个渲染树。

渲染树构建完成后,Flutter UI框架会通过CompositorContext将渲染树转换为场景。然后通过SceneBuilder将场景转换为最终的Scene对象。

最后,Flutter UI框架会通过Engine将Scene对象发送给Flutter Engine,由Flutter Engine将Scene对象绘制到屏幕上。