首先我們先來看看Flutter 啟動流程以及Flutter 和 Native 通信的原理
參考:Flutter Platform Channels、FLUTTER and native interaction
這邊先另外介紹一下Flutter 的啟動流程,我們從main.dart的main函式開始
void main() => runApp(MyApp());
其中main函式呼叫的runApp函式:
void runApp(Widget app) {
  WidgetsFlutterBinding.ensureInitialized()
    ..scheduleAttachRootWidget(app)
    ..scheduleWarmUpFrame();
}
函式中有用到Dart 語法中的級聯運算子(..),代表的含義是WidgetsFlutterBinding.ensureInitialized()生成的物件分別呼叫了scheduleAttachRootWidget和scheduleWarmUpFrame這兩個方法
runApp主要作用為:
這邊簡介分析一下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,混入了GestureBinding,SchedulerBinding,ServicesBinding,PaintingBinding,SemanticsBinding,RendererBinding和WidgetsBinding,這7個mixin(之後會在Flutter 和 Native 通訊的原理對ServicesBinding做簡介,其他內容可自行研究),而ensureInitialized方法就是獲取WidgetsBinding.instance單例的過程
這邊我們先從FlutterView 開始介紹
FlutterView 是Flutter Engine 給Flutter Framework 開放處理UI 和事件的介面,可以把Flutter Framework理解為圍繞FlutterView的一個處理框架,上面WidgetsFlutterBinding 混入的多個mixin 主要就是處理window 物件(即FlutterView 物件)的回撥事件和提交渲染內容
其中window 物件是BindingBase 的變數:
ui.SingletonFlutterWindow get window => ui.window;
ui.window是PlatformDispatcher.instance中windowId為0 的主window:
final SingletonFlutterWindow window = SingletonFlutterWindow._(0, PlatformDispatcher.instance);
SingletonFlutterWindow 的繼承關係如下
abstract class FlutterView {}
class FlutterWindow extends FlutterView {}
class SingletonFlutterWindow extends FlutterWindow {}
FlutterView有幾個重要的屬性和方法:
PlatformDispatcher是FlutterView 的核心,FlutterView是對它的一層封裝,是真正向Flutter Engine 傳送訊息和得到回撥的類別
ViewConfiguration是對Platform View 的配置資訊的描述
render方法是將Flutter 程式碼生成的渲染內容(Layer Tree生成的Scene)傳遞給Flutter Engine,讓GPU去渲染
總結:FlutterView 物件window本質上是對PlatformDispatcher 的封裝,從PlatformDispatcher 獲取一些介面相關資訊,獲取從Flutter Engine 傳送來的事件,然後觸發和轉發相應的回撥方法