Flutter启动代码如下
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container();
}
}
查看runApp方法可发现
void runApp(Widget app) {
WidgetsFlutterBinding.ensureInitialized()
..scheduleAttachRootWidget(app)
..scheduleWarmUpFrame();
}
通过WidgetsFlutterBinding.ensureInitialized()
方法可发现,此方法用来初始化binding
static WidgetsBinding ensureInitialized() {
if (WidgetsBinding.instance == null)
WidgetsFlutterBinding();
return WidgetsBinding.instance;
}
由此可发现binding是一系列单例,在通过WidgetsFlutterBinding.ensureInitialized()
方法时,同时初始化了WidgetsFlutterBinding
、BindingBase
、GestureBinding
、SchedulerBinding
、ServicesBinding
等。
-
BindingBase
:是所有类的基类,负责初始化其他类,初始化一些Native相关信息(如iOS、android、fuchsia、macOS、Linux、Windows)、注册native事件 -
GestureBinding
:提供window.onPointerDataPacket
回调,接受Native事件,负责事件转换及分发 -
SchedulerBinding
: 使用了window.scheduleFrame
来通知Native及使用window.onBeginFrame
和window.onDrawFrame
回调来接收消息,主要是负责通知Native在下一侦的事件下发与事件注册,当我们调用setState后,就会触发此类的方法,等待事件下发后进行渲染 -
ServicesBinding
: 使用window.onPlatformMessage
回调,负责通道相关的初始化及通信相关的处理 -
PaintingBinding
: 与绘制相关的函数绑定,还处理一些图片渲染相关的缓存 -
SemanticsBinding
: 注册平台相关的辅助函数 -
RendererBinding
: 初始化PipelineOwner
、renderView
、onMetricsChanged
、onTextScaleFactorChanged
、onPlatformBrightnessChanged
、onSemanticsEnabledChangedonSemanticsAction
等,用于监听并处理平台渲染相关如字体、状态栏改变时的事件,是渲染输与Flutter engine沟通的桥梁 -
WidgetsBinding
: 初始化BuildOwner
,注册window.onLocaleChanged
、onBuildScheduled
等回调。它是Flutter widget层与engine的桥梁。