Day06 Flutter 启动流程

首先我们先来看看Flutter 启动流程以及Flutter 和 Native 通信的原理

参考:Flutter Platform ChannelsFLUTTER and native interaction

Flutter 启动流程

这边先另外介绍一下Flutter 的启动流程,我们从main.dartmain函式开始

void main() => runApp(MyApp());

其中main函式呼叫的runApp函式:

void runApp(Widget app) {
  WidgetsFlutterBinding.ensureInitialized()
    ..scheduleAttachRootWidget(app)
    ..scheduleWarmUpFrame();
}

函式中有用到Dart 语法中的级联运算子(..),代表的含义是WidgetsFlutterBinding.ensureInitialized()生成的物件分别呼叫了scheduleAttachRootWidgetscheduleWarmUpFrame这两个方法

runApp主要作用为:

  1. 生成一个Flutter Engine(C++程序码)和Flutter Framework(Dart程序码)的中间桥接物件
  2. 根据**app **生成一个渲染树
  3. 绘制热身帧, 将渲染树生成的Layer图层通过Flutter Engine渲染到Flutter View

这边简介分析一下runApp流程

WidgetsFlutterBinding 中的所有程序码如下:

class WidgetsFlutterBinding extends BindingBase with GestureBinding, SchedulerBinding, ServicesBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {
  // 初始化方法
  static WidgetsBinding ensureInitialized() {
    if (WidgetsBinding.instance == null)
      // 建构方法呼叫
      WidgetsFlutterBinding();
    // 返回WidgetsBinding 物件
    return WidgetsBinding.instance!;
  }
}

WidgetsFlutterBinding继承自BindingBase,混入了GestureBindingSchedulerBindingServicesBindingPaintingBindingSemanticsBindingRendererBindingWidgetsBinding,这7个mixin(之後会在Flutter 和 Native 通讯的原理对ServicesBinding做简介,其他内容可自行研究),而ensureInitialized方法就是获取WidgetsBinding.instance单例的过程

这边我们先从FlutterView 开始介绍

FlutterViewFlutter EngineFlutter Framework 开放处理UI 和事件的介面,可以把Flutter Framework理解为围绕FlutterView的一个处理框架,上面WidgetsFlutterBinding 混入的多个mixin 主要就是处理window 物件(即FlutterView 物件)的回拨事件和提交渲染内容

其中window 物件是BindingBase 的变数:

ui.SingletonFlutterWindow get window => ui.window;

ui.windowPlatformDispatcher.instancewindowId为0 的主window

final SingletonFlutterWindow window = SingletonFlutterWindow._(0, PlatformDispatcher.instance);

SingletonFlutterWindow 的继承关系如下

abstract class FlutterView {}
class FlutterWindow extends FlutterView {}
class SingletonFlutterWindow extends FlutterWindow {}

FlutterView有几个重要的属性和方法:

  1. PlatformDispatcherFlutterView 的核心,FlutterView是对它的一层封装,是真正向Flutter Engine 传送讯息和得到回拨的类别

  2. ViewConfiguration是对Platform View 的配置资讯的描述

  3. render方法是将Flutter 程序码生成的渲染内容(Layer Tree生成的Scene)传递给Flutter Engine,让GPU去渲染

总结:FlutterView 物件window本质上是对PlatformDispatcher 的封装,从PlatformDispatcher 获取一些介面相关资讯,获取从Flutter Engine 传送来的事件,然後触发和转发相应的回拨方法


<<:  [13th][Day13] docker file

>>:  [13th][Day11] errgroup

[Python 爬虫这样学,一定是大拇指拉!] DAY05 - URL / URN / URI (1)

本篇章主要是先从技术层面来解释 URI 与 URL 及比较少使用到却与生活息息相关的 URN,让读者...

Day24:24 - 结帐服务(8) - 前端 - 显示总订单资料、订单详情

Nnọọ,我是Charlie! 在Day23当中我们完成了订单资料的後端API,而今天我们将完成订单...

【从零开始的Swift开发心路历程-Day23】天气预报App实作Part2

昨天我们已经能成功将JSON格式的资料print出来了,接着就来实作天气预报App吧! 首先,我们要...

铁人赛 Day24 -- JavaScript 初体验(二) -- 点击後换图片

前言 最近因为上班进度缓慢,所以内容比较慢,但应该也只能这样了哈哈,我们今天也一样会用到 Oncli...

JavaScript Day 4. ParseInt / ToString

ParseInt() 直到我在写这篇之前,parseInt 在我心中都还是一个很简单的概念,一个可以...