news 2026/5/25 16:43:27

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/26 4:49:37

Android智能代理评估新范式:动态基准环境如何重塑移动AI测试标准

Android智能代理评估新范式:动态基准环境如何重塑移动AI测试标准 【免费下载链接】androidgen-glm-4-9b 项目地址: https://ai.gitcode.com/zai-org/androidgen-glm-4-9b 在移动AI技术快速迭代的当下,传统评估方法正面临严峻挑战。如何准确衡量A…

作者头像 李华
网站建设 2026/5/25 14:24:49

React Native Vision Camera实战:从零构建高性能AR拍摄应用

React Native Vision Camera实战:从零构建高性能AR拍摄应用 【免费下载链接】react-native-vision-camera 📸 A powerful, high-performance React Native Camera library. 项目地址: https://gitcode.com/GitHub_Trending/re/react-native-vision-cam…

作者头像 李华
网站建设 2026/5/25 21:30:10

告别机械音!EmotiVoice让AI语音充满喜怒哀乐的真实情感

告别机械音!EmotiVoice让AI语音充满喜怒哀乐的真实情感 在虚拟主播的直播间里,一个观众突然提问:“你真的开心吗?” 主播笑了——不是预录的那种生硬笑声,而是带着轻微颤抖、尾音上扬的、仿佛从心底涌出的真实喜悦。 这…

作者头像 李华
网站建设 2026/5/26 4:54:16

Unitree机器人Python SDK终极指南:从零开始实现机器人控制

Unitree机器人Python SDK终极指南:从零开始实现机器人控制 【免费下载链接】unitree_sdk2_python Python interface for unitree sdk2 项目地址: https://gitcode.com/gh_mirrors/un/unitree_sdk2_python 想要用Python轻松控制Unitree机器人吗?un…

作者头像 李华
网站建设 2026/5/25 21:39:19

豆包手机与应用封杀:技术变革与商业帝国的正面交锋

2025年12月,豆包手机一经发布,就引起了巨大的关注。这款结合了深度AI助手与智能操作系统的手机,在市场上被视为一次对传统智能手机行业的颠覆。然而,刚刚推出不久,豆包手机便遭遇了 微信、支付宝、淘宝 等主流应用的封…

作者头像 李华
网站建设 2026/5/26 4:54:48

DSP28335 ADC的转换和计算方法,电压对应的是3V还是3.3V?对应ADC是4095还是4096?

对于DSP28335的ADC,一个最关键的信息是:其满量程对应的电压是3.0V,而不是系统电源的3.3V。输入电压若超过3V可能会损坏芯片。 下面是它的转换原理、计算方法和一些需要注意的关键点。 📊 ADC转换计算方法 DSP28335内置一个12位ADC,可将0-3V的模拟电压线性映射为0-4095…

作者头像 李华