news 2026/5/14 13:24:51

dart特性之 --- mixin

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
dart特性之 --- mixin

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不是指向父类,而是指前一个代码块。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 17:54:22

边缘设备能跑EmotiVoice吗?树莓派部署尝试

边缘设备能跑EmotiVoice吗?树莓派部署尝试 在智能语音助手越来越“听得懂人话”的今天,我们似乎也对它的声音提出了更高要求:不再满足于冰冷的机械朗读,而是期待它能“高兴地打招呼”、或“严肃地提醒天气”。这种对情感化语音输出…

作者头像 李华
网站建设 2026/5/12 17:54:06

ELK 是一套**开源的日志收集、存储、分析与可视化的技术栈

ELK 是一套开源的日志收集、存储、分析与可视化的技术栈,由 Elastic 公司(原 Elasticsearch BV)开发的三款核心产品的首字母缩写组成,是目前企业级日志管理、运维监控、安全审计的主流解决方案之一。 E:Elasticsearch …

作者头像 李华
网站建设 2026/5/12 17:54:25

绿色工厂建设中能碳管理的 12 个关键技术环节解析

在绿色工厂和“双碳”目标背景下,工业企业对能碳管理的认知正在发生变化。 与早期以节能为目的的能耗统计不同,当前政策更关注企业是否具备长期运行、可追溯、可核查的能碳管理体系。 《工业企业和园区数字化能碳管理中心建设指南》(工信厅节…

作者头像 李华
网站建设 2026/5/13 17:28:06

【Linux命令大全】001.文件管理之chmod命令(实操篇)

【Linux命令大全】001.文件管理之chmod命令(实操篇) ✨ 本文全面解析Linux系统中chmod命令的功能、参数及实际应用,帮助系统管理员和高级用户更好地管理文件和目录的访问权限。文章涵盖参数详解、基础用法、进阶技巧以及常见场景的实际操作。…

作者头像 李华
网站建设 2026/5/12 13:06:52

【Linux命令大全】001.文件管理之chown命令(实操篇)

【Linux命令大全】001.文件管理之chown命令(实操篇) ✨ 本文全面解析Linux系统中chown命令的功能、参数及实际应用,帮助系统管理员和高级用户更好地管理文件和目录的所有权。文章涵盖参数详解、基础用法、进阶技巧以及常见场景的实际操作。 文…

作者头像 李华