当前位置: 首页 > news >正文

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

http://www.rkmt.cn/news/116515.html

相关文章:

  • 大专会计就业规划:上岗必考7大证书盘点与企业刚需解析
  • EmotiVoice情感分类体系揭秘:六种基础情绪如何建模?
  • ScriptHookV模组开发实战:从入门到精通的完整指南
  • 单词倒排 和 字符串P型编码
  • 结合LLM使用EmotiVoice:大模型+情感语音的完整闭环方案
  • Windows程序资源编辑神器rcedit:告别繁琐的图形界面操作
  • Doris集群搭建
  • React Native Vision Camera实战:从零构建高性能AR拍摄应用
  • EmotiVoice技术解析:多情感语音合成背后的秘密
  • 重磅!AI应用架构师力推的企业虚拟运营方案_副本
  • EmotiVoice能否用于外语学习?模仿母语者语调的功能验证
  • Easy Effects音效优化完全指南:从入门到精通的专业预设配置
  • ComfyUI-SeedVR2视频超分插件完整安装与配置指南
  • Bruno技术深度解析:API测试工具的架构革新与实践
  • EmotiVoice语音个性档案系统设计构想
  • EmotiVoice能否生成动物叫声拟人化语音?趣味实验展示
  • Taiga开源敏捷项目管理工具:从零到精通的终极实践指南
  • 40、邮件规则集定义与垃圾邮件过滤指南
  • 重磅发布!2025年广东视觉检测设备权威测评榜单 - 一搜百应
  • 域控操作十六:开启电脑指纹解锁
  • 2025温州婚纱店推荐星级排名及选择指南 - 提酒换清欢
  • Docker 权限问题:为什么容器里读不到文件?
  • 树的价值
  • 域控操作十五:开启域控范围内所有电脑的远程桌面,并将当前登录用户添加进远程桌面权限组
  • Ant Design设计工具集成实战:打破设计与开发壁垒的3步解决方案
  • 3大突破性功能:ImageViewer重新定义图片浏览体验
  • Memobase项目快速上手:构建智能记忆系统的完整指南
  • 域控操作十:安装包exe转msi软件下发
  • 使用Playwright集成亮数据IP代理获取AI热点
  • Docker 常见问题:容器里访问不了外部网络怎么办?