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 12:29:39

EmotiVoice在短视频配音中的高效应用案例

EmotiVoice在短视频配音中的高效应用案例 在抖音、快手、TikTok等平台日均产生数亿条短视频的今天,内容创作者正面临一个核心挑战:如何以极低成本、极高效率地生成富有感染力的配音?传统依赖真人录音或通用语音合成工具的方式,要么…

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

Material Kit轮播图3大痛点解析:如何用5步打造专业级动态展示

Material Kit轮播图3大痛点解析:如何用5步打造专业级动态展示 【免费下载链接】material-kit Free and Open Source UI Kit for Bootstrap 5, React, Vue.js, React Native and Sketch based on Googles Material Design 项目地址: https://gitcode.com/gh_mirro…

作者头像 李华
网站建设 2026/6/9 22:55:31

EmotiVoice能否实现多人对话同步生成?群组语音功能设想

EmotiVoice 能否实现多人对话同步生成?群组语音功能设想 在虚拟主播直播中,观众常看到多个 AI 角色同屏互动;在有声剧中,旁白与角色对白交错推进情节;在智能客服培训系统里,AI 模拟客户、主管与员工三方辩论…

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

Python实战-学生信息管理系统开发(Tkinter+Json)

本项目是一个基于Python Tkinter的图形化学生信息管理系统,实现学生信息的增删改查、数据保存和文件导出等功能。 这个学生信息管理系统的逻辑非常简单,它就像一个电子笔记本:所有学生信息都记在一个列表里,并自动保存成一个文件&…

作者头像 李华
网站建设 2026/6/9 20:10:19

导热系数测试仪厂家推荐排行榜:2025最新口碑单深度解析

在选择导热系数测试仪时,企业常常面临诸多困扰。比如,测试结果不准确,影响产品研发进度;设备稳定性差,频繁出现故障耽误生产;售后服务不及时,遇到问题无法快速解决。为了帮助企业快速找到靠谱的…

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

Java中Set集合的概念

java.util.Set 是 Java 集合框架的子接口,继承自 Collection 接口,核心特征是存储的元素无序且不可重复,不支持通过索引访问元素。 一、核心特性 1. 元素唯一性 Set 集合不允许存储重复元素,判断元素是否重复的依据是 equals…

作者头像 李华