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í)初始化了WidgetsFlutterBinding、BindingBase、GestureBinding、SchedulerBinding、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.onBeginFrame和window.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、renderView、onMetricsChanged、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的橋梁。