一、前言
Flutter程序的入口函數(shù)是runApp(Widget app),查看函數(shù)聲明,我們可以發(fā)現(xiàn)這個函數(shù)主要做了三件事:1.實例化WidgetsFlutterBinding類,2.創(chuàng)建組件樹attachRootWidget(app),3.啟動預(yù)熱幀scheduleWarnUpFrame()。
void runApp(Widget app) {
WidgetsFlutterBinding.ensureInitialized()
..attachRootWidget(app)
..scheduleWarmUpFrame();
}
二、分析
下面進一步探究App啟動的具體過程。
1.WidgetsFlutterBinding實例化
class WidgetsFlutterBinding extends BindingBase with GestureBinding, ServicesBinding, SchedulerBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {
static WidgetsBinding ensureInitialized() {
if (WidgetsBinding.instance == null)
WidgetsFlutterBinding();
return WidgetsBinding.instance;
}
}
WidgetsFlutterBinding類繼承自BindingBase基類和其它一些特定功能特性類,該類是將基于組件框架的應(yīng)用程序綁定到Flutter引擎的膠水類,并返回一個WidgetsBinding實例。
-
BindingBase: 該類是一個抽象類基類,初始化拓展服務(wù),其申明的接口由其子類實現(xiàn)。
-GestureBinding: 該類綁定了手勢事件,用于檢測應(yīng)用程序各類手勢。它以mixin的方式加入到WidgetsFlutterBinding中,并實現(xiàn)了BindingBase類中的部分方法。
-ServicesBinding:該類監(jiān)聽了平臺消息(platform messages),注冊了Flutter層與Native層的消息傳輸服務(wù),最終將消息定向到BinaryMessages類中。
-SchedulerBinding: 該類注冊了頁面幀繪制有關(guān)的回調(diào)函數(shù),同時也處理Widget生命周期相關(guān)事件,處理的事件類型包括:paused、resumed、inactive和suspending。
-PaintingBinding:綁定繪制庫,同時還創(chuàng)建了圖片緩存。
-SemanticsBinding:將組件語義樹與Flutter引擎綁定
-RendererBinding:將組件渲染樹與Flutter引擎綁定
-WidgetsBinding:將組件樹與Flutter引擎綁定
2.attachRootWidget(Widget rootWidget)函數(shù)
void attachRootWidget(Widget rootWidget) {
_renderViewElement = RenderObjectToWidgetAdapter<RenderBox>(
container: renderView,
debugShortDescription: '[root]',
child: rootWidget,
).attachToRenderTree(buildOwner, renderViewElement);
}
該函數(shù)調(diào)用RenderObjectToWidgetAdapter函數(shù)創(chuàng)建了一個RenderBox,緊接著將改組件作為根節(jié)點并調(diào)用attachToRenderTree把組件綁定到Widget樹中。
3.scheduleForcedFrame()函數(shù)
該函數(shù)作用是在App啟動是盡快運行預(yù)熱幀,而不是等待引擎請求幀以響應(yīng)系統(tǒng)“Vsync”信號。
三、總結(jié)
局限于本身的能力范圍,以上僅僅是淺顯地探究了Flutter程序啟動時執(zhí)行過程。還有許多關(guān)鍵地方?jīng)]有有待補充,日后慢慢完善吧。