二、Flutter程序啟動過程淺析

一、前言

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、resumedinactivesuspending。
    -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)]有有待補充,日后慢慢完善吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容