Flutter啟動(dòng)流程

Flutter啟動(dòng)代碼如下


void main() {

runApp(MyApp());

}

class MyApp extends StatelessWidget {

const MyApp({Key key}) : super(key: key);

@override

Widget build(BuildContext context) {

return Container();

}

}

查看runApp方法可發(fā)現(xiàn)


void runApp(Widget app) {

WidgetsFlutterBinding.ensureInitialized()

..scheduleAttachRootWidget(app)

..scheduleWarmUpFrame();

}

通過WidgetsFlutterBinding.ensureInitialized() 方法可發(fā)現(xiàn),此方法用來初始化binding


static WidgetsBinding ensureInitialized() {

if (WidgetsBinding.instance == null)

WidgetsFlutterBinding();

return WidgetsBinding.instance;

}

由此可發(fā)現(xiàn)binding是一系列單例,在通過WidgetsFlutterBinding.ensureInitialized() 方法時(shí),同時(shí)初始化了WidgetsFlutterBindingBindingBase、GestureBindingSchedulerBinding、ServicesBinding等。

  • BindingBase:是所有類的基類,負(fù)責(zé)初始化其他類,初始化一些Native相關(guān)信息(如iOS、android、fuchsia、macOS、Linux、Windows)、注冊(cè)native事件
  • GestureBinding:提供window.onPointerDataPacket回調(diào),接受Native事件,負(fù)責(zé)事件轉(zhuǎn)換及分發(fā)
  • SchedulerBinding: 使用了window.scheduleFrame來通知Native及使用window.onBeginFramewindow.onDrawFrame回調(diào)來接收消息,主要是負(fù)責(zé)通知Native在下一偵的事件下發(fā)與事件注冊(cè),當(dāng)我們調(diào)用setState后,就會(huì)觸發(fā)此類的方法,等待事件下發(fā)后進(jìn)行渲染
  • ServicesBinding: 使用window.onPlatformMessage回調(diào),負(fù)責(zé)通道相關(guān)的初始化及通信相關(guān)的處理
  • PaintingBinding: 與繪制相關(guān)的函數(shù)綁定,還處理一些圖片渲染相關(guān)的緩存
  • SemanticsBinding: 注冊(cè)平臺(tái)相關(guān)的輔助函數(shù)
  • RendererBinding: 初始化PipelineOwner、renderViewonMetricsChanged、onTextScaleFactorChanged、onPlatformBrightnessChanged、onSemanticsEnabledChangedonSemanticsAction等,用于監(jiān)聽并處理平臺(tái)渲染相關(guān)如字體、狀態(tài)欄改變時(shí)的事件,是渲染輸與Flutter engine溝通的橋梁
  • WidgetsBinding: 初始化BuildOwner,注冊(cè)window.onLocaleChanged、onBuildScheduled等回調(diào)。它是Flutter widget層與engine的橋梁。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 說起啟動(dòng)那必須從main方法開始呀 runApp的代碼很簡單,傳遞一個(gè)Widget參數(shù),然后執(zhí)行了三行代碼,三行代...
    flutter閱讀 2,309評(píng)論 3 7
  • 本文我們來分析下Flutter的啟動(dòng)流程,首先我們從main.dart文件的main函數(shù)開始: main函數(shù)則調(diào)用...
    chonglingliu閱讀 1,157評(píng)論 3 2
  • 一、flutter啟動(dòng)流程1.實(shí)例化WidgetsFlutterBinding類,2.創(chuàng)建組件樹attachRoo...
    齊玉婷閱讀 3,226評(píng)論 0 9
  • 使用Flutter開發(fā)項(xiàng)目時(shí),只需要調(diào)用入口函數(shù)main(MyApp()),Flutter項(xiàng)目就運(yùn)行起來了;之后進(jìn)...
    only_run閱讀 2,279評(píng)論 2 2
  • Flutter Framework 視圖樹的創(chuàng)建與管理機(jī)制、布局、渲染核心框架 視圖樹 Widget => 為El...
    沐沐小火柴閱讀 1,277評(píng)論 1 2

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