直接查看runApp的源码:
void runApp(Widget app) {
WidgetsFlutterBinding.ensureInitialized()
..scheduleAttachRootWidget(app)
..scheduleWarmUpFrame();
}
进入WidgetsFlutterBinding类
class WidgetsFlutterBinding extends BindingBase with GestureBinding, SchedulerBinding, ServicesBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {
static WidgetsBinding ensureInitialized() {
if (WidgetsBinding.instance == null)
WidgetsFlutterBinding();
return WidgetsBinding.instance!;
}
}
可以看到,WidgetsFlutterBinding没有显式的定义构造方法,那么在调用它的构造方法的时候,其实是在调用父类的构造方法(官方文档),WidgetsFlutterBinding的直接父类其实是WidgetsBinding(为什么直接父类是WidgetsBinding),这个类也没有显式定义的构造方法,那就会继续调用WidgetsBinding的直接父类的无参构造方法,即RendererBinding,就这样以此类推,最后会来到BindingBase类的无参构造方法。
BindingBase() {
developer.Timeline.startSync('Framework initialization');
initInstances();
initServiceExtensions();
developer.postEvent('Flutter.FrameworkInitialization', <String, String>{});
developer.Timeline.finishSync();
}
按照我们上面的分析,在WidgetsBinding调用父类的构造方法之后,还会执行initInstances();
mixin WidgetsBinding on BindingBase, ServicesBinding, SchedulerBinding, GestureBinding, RendererBinding, SemanticsBinding {
@override
void initInstances() {
super.initInstances();
_instance = this;
assert(() {
_debugAddStackFilters();
return true;
}());
// Initialization of [_buildOwner] has to be done after
// [super.initInstances] is called, as it requires [ServicesBinding] to
// properly setup the [defaultBinaryMessenger] instance.
_buildOwner = BuildOwner();
buildOwner!.onBuildScheduled = _handleBuildScheduled;
window.onLocaleChanged = handleLocaleChanged;
window.onAccessibilityFeaturesChanged = handleAccessibilityFeaturesChanged;
SystemChannels.navigation.setMethodCallHandler(_handleNavigationInvocation);
FlutterErrorDetails.propertiesTransformers.add(transformDebugCreator);
}
}
可以看到,在initInstances方法里面进行了BuildOwner对象的实例化等工作。
接着会对WidgetsFlutterBinding继承的所有类都执行initInstances方法,完成各自的实例化。
上面的例子可以使用下面的demo验证:
class Person {
Person() {
print("Person");
init();
}
init() {
print("person init");
}
}
class Student extends Person with Work {}
mixin Work on Person {
@override
init() {
print("work init");
}
}
void main() {
Student();
/*
输出:
Person
work init
*/
}