news 2026/6/10 15:32:06

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/6/10 11:29:51

XVim终极使用指南:掌握Xcode中的Vim编辑技巧

XVim终极使用指南:掌握Xcode中的Vim编辑技巧 【免费下载链接】XVim Xcode plugin for Vim keybindings 项目地址: https://gitcode.com/gh_mirrors/xv/XVim 想要在Xcode中体验Vim的高效编辑模式吗?XVim插件正是您需要的解决方案。这款开源工具将V…

作者头像 李华
网站建设 2026/6/10 11:11:45

Android模糊效果实战指南:从入门到精通

Android模糊效果实战指南:从入门到精通 【免费下载链接】BlurView Android blur view 项目地址: https://gitcode.com/gh_mirrors/blu/BlurView 在当今追求极致用户体验的移动应用开发中,模糊效果已经成为提升界面质感的重要技术手段。无论是iOS系…

作者头像 李华
网站建设 2026/6/10 15:05:12

我发现联邦学习加差分隐私破解跨境罕见病早筛数据孤岛

📝 博客主页:Jax的CSDN主页 目录医生的AI助手:从“听不懂人话”到“病历整理狂魔” 一、我的AI医生初体验 二、AI病历大法好 三、当AI遇到中医 四、AI的"中年危机" 五、未来医疗的AB面 六、那些年AI搞砸的诊断 七、医生的新技能树 …

作者头像 李华
网站建设 2026/6/10 11:27:32

AI 3D生成终极指南:从零开始快速上手Stable-Dreamfusion

AI 3D生成终极指南:从零开始快速上手Stable-Dreamfusion 【免费下载链接】stable-dreamfusion Text-to-3D & Image-to-3D & Mesh Exportation with NeRF Diffusion. 项目地址: https://gitcode.com/gh_mirrors/st/stable-dreamfusion 想要将文字描述…

作者头像 李华
网站建设 2026/6/10 13:47:50

EmotiVoice自定义音色保存与调用机制实现方法

EmotiVoice自定义音色保存与调用机制实现方法 在虚拟主播直播带货、游戏角色深情独白、企业语音助手亲切问候的今天,我们早已不再满足于“机器念字”式的语音合成。用户期待的是有温度、有个性、有情绪的声音——一个能被记住的“声纹身份”。而EmotiVoice正是这样一…

作者头像 李华