许昌市网站建设_网站建设公司_版式布局_seo优化
2025/12/17 16:43:18 网站建设 项目流程

mixin官网介绍

对于mixin的介绍和基本使用大家可以直接点击上面的官网链接产看,本篇主要探究混入链中的方法的调用顺序,起因来自于在查看flutter入口方法runApp()的源码处的疑问,下面以简化源码的方式进行分析。

abstract class BindingBase { BindingBase() { initInstances(); } void initInstances() { print("调用BindingBase中的initInstances()"); } } mixin GestureBinding on BindingBase { @override void initInstances() { print("调用GestureBinding中的initInstances()"); super.initInstances(); print("执行GestureBinding中的initInstances()完成"); } } mixin SchedulerBinding on BindingBase { @override void initInstances() { print("调用SchedulerBinding中的initInstances()"); super.initInstances(); print("执行SchedulerBinding中的initInstances()完成"); } } mixin ServicesBinding on BindingBase { @override void initInstances() { print("调用ServicesBinding中的initInstances()"); super.initInstances(); print("执行ServicesBinding中的initInstances()完成"); } } mixin PaintingBinding on BindingBase { @override void initInstances() { print("调用PaintingBinding中的initInstances()"); super.initInstances(); print("执行PaintingBinding中的initInstances()完成"); } } mixin SemanticsBinding on BindingBase { @override void initInstances() { print("调用SemanticsBinding中的initInstances()"); super.initInstances(); print("执行SemanticsBinding中的initInstances()完成"); } } mixin RendererBinding on BindingBase { @override void initInstances() { print("调用RendererBinding中的initInstances()"); super.initInstances(); print("执行RendererBinding中的initInstances()完成"); } } mixin WidgetsBinding on BindingBase { @override void initInstances() { print("调用WidgetsBinding中的initInstances()"); super.initInstances(); print("执行WidgetsBinding中的initInstances()完成"); } } class WidgetsFlutterBinding extends BindingBase with GestureBinding, SchedulerBinding, ServicesBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding { static WidgetsBinding ensureInitialized() { return WidgetsFlutterBinding(); } } void main() { WidgetsFlutterBinding.ensureInitialized(); }

执行main()后,打印输出顺序为:

调用RendererBinding中的initInstances() 调用SemanticsBinding中的initInstances() 调用PaintingBinding中的initInstances() 调用ServicesBinding中的initInstances() 调用SchedulerBinding中的initInstances() 调用GestureBinding中的initInstances() 调用BindingBase中的initInstances() 执行GestureBinding中的initInstances()完成 执行SchedulerBinding中的initInstances()完成 执行ServicesBinding中的initInstances()完成 执行PaintingBinding中的initInstances()完成 执行SemanticsBinding中的initInstances()完成 执行RendererBinding中的initInstances()完成 执行WidgetsBinding中的initInstances()完成

代码调用过程:

调用 WidgetsFlutterBinding() //由于他没有显式构造方法会调用到父类的构造方法 | |/ BindingBase() -> initInstances() //父类的构造方法中调用了initInstances() | |/ WidgetsBinding.initInstances() -> super.initInstances() | |------------------------------| | |/ RendererBinding.initInstances() -> super.initInstances() | |------------------------------| | |/ SemanticsBinding.initInstances() -> super.initInstances() | |------------------------------| | |/ PaintingBinding.initInstances() -> super.initInstances() | |------------------------------| | |/ ServicesBinding.initInstances() -> super.initInstances() | |------------------------------| | |/ SchedulerBinding.initInstances() -> super.initInstances() | |------------------------------| | |/ GestureBinding.initInstances()-> super.initInstances() | |------------------------------| | |/ BindingBase.initInstances()

得出以下结论:

1.会得到以下混入链

WidgetsFlutterBinding -> BindingBase -> GestureBinding -> SchedulerBinding -> ServicesBinding -> PaintingBinding -> SemanticsBinding -> RendererBinding ->WidgetsBinding

前面mixin代码块中的方法会被后面mixin代码块中的同名方法覆盖。

2.在混入链的使用场景下的super不是指向父类,而是指前一个代码块。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询