Flutter mixin用法详解
mixin是什么
mixin应该怎么理解呢,对Java系出身的我来说,这是一个新概念,各类资料的介绍也没找到一个清晰的定义。从个人理解来看,可以把它想象为Kotlin中的接口(和Java的区别是可以带非抽象的属性和方法),而多个mixin可以相互覆盖以实现组合,提供了非常大的灵活性,也可以达到类似多重继承的效果,本文将从简单到复杂,演示mixin在Dart中的用法
最简单的mixin
mixin TestMixin {void test() {print('test');}int testInt = 1;void test2();
}class Test with TestMixin {@overridetest2() {print('test2');}
}void main() {Test().test(); // testprint(Test().testInt); // 1Test().test2(); // test2
}
复制代码
mixin本身可以是抽象的,可以定义各种方法属性,也可以是抽象的,等后续类去实现
基于某个类型的mixin
class BaseObject {void method() {print('call method');}
}
mixin TestMixin on BaseObject{void test() {print('test');}int testInt = 1;void test2() {method();}
}class Test extends BaseObject with TestMixin {
}void main() {Test().test(); // testprint(Test().testInt); // 1Test().test2(); // call method
}
复制代码
当使用on关键字,则表示该mixin只能在那个类的子类使用了,那么结果显然的,mixin中可以调用那个类定义的方法、属性
多个mixin
mixin TestMixin {void test() {print('test');}int testInt = 1;void test2();
}mixin TestMixin2 {int testInt = 2;void test3() {print('test3');}
}class Test with TestMixin, TestMixin2 {@overridetest2() {print('test2');}
}void main() {Test().test(); // testprint(Test().testInt); // 2Test().test2(); // test2Test().test3(); // test3
}
复制代码
如果把TestMixin和TestMixin2的先后顺序改一下:
mixin TestMixin {void test() {print('test');}int testInt = 1;void test2();
}mixin TestMixin2 {int testInt = 2;void test3() {print('test3');}
}class Test with TestMixin2, TestMixin {@overridetest2() {print('test2');}
}void main() {Test().test(); // testprint(Test().testInt); // 1Test().test2(); // test2Test().test3(); // test3
}
复制代码
如果mixin存在冲突的部分,后面会覆盖前面的,没有冲突的则会保留,所以可以存在后面的mixin修改了前面的mixin的一部分逻辑的情况,不需要直接继承即可实现覆盖,避免了更复杂的继承关系
"多重继承"
mixin TestMixin on BaseClass {void init() {print('TestMixin init start');super.init();print('TestMixin init end');}
}mixin TestMixin2 on BaseClass {void init() {print('TestMixin2 init start');super.init();print('TestMixin2 init end');}
}class BaseClass {void init() {print('Base init');}BaseClass() {init();}
}class TestClass extends BaseClass with TestMixin, TestMixin2 {@overridevoid init() {print('TestClass init start');super.init();print('TestClass init end');}
}void main() {TestClass();/// TestClass init start/// TestMixin2 init start/// TestMixin init start/// Base init/// TestMixin init end/// TestMixin2 init end/// TestClass init end
}
复制代码
稍微有点绕,可以看到,这已经事实上达到多重继承才能达到的效果了,写起来比较麻烦,某种程度上也更不容易出错(相对于C++)。。。源码里有最好也最复杂的例子—WidgetsFlutterBinding,它的定义如下:
class WidgetsFlutterBinding extends BindingBase with GestureBinding, ServicesBinding, SchedulerBinding, PaintingBinding, SemanticsBinding, RendererBinding, WidgetsBinding {}
复制代码
具体WidgetsFlutterBinding的分析就没啦,自己看源码去吧~~
Flutter mixin用法详解相关推荐
- 导出jar插件_Fluttify输出的Flutter插件工程详解
系列文章: yohom:Fluttify输出的Flutter插件工程详解zhuanlan.zhihu.com yohom:开发Flutter插件必备原生SDK->Dart接口生成引擎`Flut ...
- python argv 详解_Python3 sys.argv[ ]用法详解
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...
- oracle中的exists 和 not exists 用法详解
from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...
- ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...
- python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
- C++中substr()函数用法详解
C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...
- php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy
Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...
- LayoutInflater的inflate函数用法详解
LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...
- Ext.Net学习笔记22:Ext.Net Tree 用法详解
上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...
- WinDbg用法详解
WinDbg用法详解 对WinDbg的方方面面作了详细的讲解. 转载于:https://blog.51cto.com/laokaddk/125111
最新文章
- nagle算法和延迟ACK
- 语音预处理:服务器平台“部署”
- 开启Apache mod_rewrite模块(解决404 Not Found)
- 2021年中国计算机视觉人才调研开启啦,诚邀各位开发者们参与~
- jquery常见获取高度
- VMware vsphere 中创建虚拟机的方法
- Spark键值对RDD的转化操作
- jquery尺寸:宽度与高度
- BUAA OO 2019 第一单元作业总结
- 灰色系统理论及其应用
- java 文件流下载pdf
- matlab单项pwm整流电流内环pr控制仿真,基于PR的单相PWM整流器电流控制研究
- SD卡和SDHC卡操作
- Qt5使用Poppler实现PDF阅读器
- 服务器干货分享!做APP服务器怎么选择?
- 160亿数据点图表控件LightningChart振动分析可以检测什么?
- 港股通与全球一体化投资交易系统实践
- 关于所谓U盘有占用空间,却看不到文件的一些看法
- Plus版SBOM:流水线物料清单PBOM
- IDELAY输入延迟分析