class WidgetsFlutterBinding extends BindingBase with GestureBinding, ServicesBinding, SchedulerBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {
static WidgetsBinding ensureInitialized() {
if (WidgetsBinding.instance == null)
WidgetsFlutterBinding();
return WidgetsBinding.instance;
}
}
这个类继承自BindingBase
并且混入(Mixin
)了很多其他类,看名称都是不同功能的绑定。而静态函数ensureInitialized()
所做的就是返回一个WidgetsBinding.instance
单例。
混入的那些各种绑定类也都是继承自抽象类BindingBase
的。
abstract class BindingBase {
BindingBase() {
…
initInstances();
…
}
…
ui.Window get window => ui.window;
}
关于抽象类BindingBase
,你需要了解两个地方,一个是在其构造的时候会调用函数initInstances()
。这个函数会由其子类,也就是上面说那些各种混入(Mixin)的绑定类各自实现,具体的初始化都是在其内部实现的。另一个就是BindingBase
有一个getter
,返回的是window
。还记得在《Flutter框架分析(一)-- 总览和Window》中提到过的窗口吗?没错,这里的window
就是它。那我们是不是可以推论,这些个绑定其实就是对window
的封装?来,让我们挨个看一下这几个绑定类在调用initInstances()
的时候做了什么的吧。
第一个是GestureBinding
。手势绑定。
mixin GestureBinding on BindingBase implements HitTestable, HitTestDispatcher, HitTestTarget {
@override
void initInstances() {
super.initInstances();
_instance = this;
window.onPointerDataPacket = _handlePointerDataPacket;
}
在调用initInstances()
的时候,主要做的事情就是给window
设置了一个手势处理的回调函数。所以这个绑定主要是负责管理手势事件的。
第二个是ServicesBinding
。服务绑定
mixin ServicesBinding on BindingBase {
@override
void initInstances() {
super.initInstances();
_instance = this;
window
…onPlatformMessage = BinaryMessages.handlePlatformMessage;
initLicenses();
}
这个绑定主要是给window
设置了处理Platform Message的回调。
第三个是SchedulerBinding
。调度绑定。
mixin SchedulerBinding on BindingBase, ServicesBinding {
@overri