iT邦幫忙

2021 iThome 鐵人賽

DAY 6
0
Mobile Development

Flutter - 從 Packages & Plugins 掌握原生系列 第 6

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 傳送來的事件,然後觸發和轉發相應的回撥方法


上一篇
Day05 platform channels
下一篇
Day07 Flutter 和 Native 通訊的原理 01
系列文
Flutter - 從 Packages & Plugins 掌握原生30

尚未有邦友留言

立即登入留言