WidgetsBinding什么时候初始化

105 阅读1分钟

直接查看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
	*/
}