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