Flutter/Dart第05天:Dart特别特性Mixin详解
Dart官网文档:https://dart.dev/language/mixins
重要阐明:本博客依据Dart官网文档,但并不是简略的对官网进行翻译,在掩盖中心功用情况下,我会依据个人研制经历,参加自己的一些扩展问题和场景验证。
Mixin意图和运用办法(with)
官网文档:Mixins are a way of defining code that can be reused in multiple class hierarchies. They are intended to provide member implementations en masse.
大约意思:Mixin是一种界说可在多个类层次结构中复用代码的办法。Mixin的方针是为这些类供给一批成员完成(类特点+类办法)。
总结起来:运用Mixin能够让代码被其他类所运用(包含特点和办法)。
运用办法:经过mixin
关键字界说一个Mixin类;经过with
关键字,一个类能够一起复用多个mixin成员完成。
代码样例:如下代码,ClassA一起具有了MixinOne+MixinTwo+MixinThree这3个Mixin的一切成员特点和类办法(感觉有的像多承继?)。
mixin MixinOne {
......
}
mixin MixinTwo {
......
}
mixin MixinThree {
......
}
class ClassA extends SupperClass with MixinOne, MixinTwo, MixinThree {
......
}
Mixin的运用有哪些束缚呢?
- Mixin不能承继其他Mixin或许抽象类。
- Mixin不能有结构办法,也便是Mixin不能被实例化。
Mixin限制/承继其他类型(on)
为了更好的保护Mixin这些可复用的代码,咱们有时需求严厉限制运用Mixin的类型,经过on
关键字到达意图。
代码样例:如下代码,MixinFine经过on
关键字限制运用它的类型是SupperClass,但凡运用MixinFine的类,有必要extends承继SupperClass这个Mixin限制的类型。
class SupperClass {
......
}
mixin MixinFine on SupperClass {
......
}
class ClassFine extends SupperClass with MixinFine {
......
}
mixin class介绍和运用(类+Mixin)
咱们经过mixin
界说一个Mixin,经过class
界说一个类;那么经过mixin class
就能够界说一个mixin和一个类,它们具有相同的姓名和相同的类型。
Mixin和类的一切束缚,在mixin class一起收效,包含如下:
- Mixin不支持extends承继其他类和with复用其他Mixin,因而mixin class也不能有extends承继其他类和with复用其他Mixin
- 一般类不支持经过on关键字限制可运用类型,因而mixin class也不支持on关键字(可是咱们能够经过abstract到达此意图)。
代码样例:如下代码,mixin class
可经过with
关键字当成Mixin被运用,也可经过extends
关键字当成类被承继运用。
abstract mixin class Musician {
// 含有abstract办法,运用它的类有必要完成本办法
void playInstrument(String instrumentName);
void playPiano() {
playInstrument('Piano');
}
void playFlute() {
playInstrument('Flute');
}
}
class Virtuoso with Musician {
// with关键字,Musician作为一个Mixin被运用
void playInstrument(String instrumentName) {
print('Plays the $instrumentName beautifully');
}
}
class Novice extends Musician {
// extends关键字,Musician作为一个类被承继
void playInstrument(String instrumentName) {
print('Plays the $instrumentName poorly');
}
}
扩展问题:Mixin怎么处理二义性?(掩盖)
经过上面的阐明,一个类能够运用多个Mixin的完成,那么有个问题:他们是怎么处理二义性的呢?
样例阐明:如下代码,咱们有2个Mixin,他们的特点和办法都是相同,一起运用他们时,终究的特点和办法是哪个Mixin的呢?
mixin MixinA {
String className = "MixinA";
void log() {
print(className);
}
}
mixin MixinB {
String className = "MixinB";
void log() {
print(className);
}
}
class ClassMixinAB with MixinA, MixinB {
}
class ClassMixinBA with MixinB, MixinA {
}
void main() {
ClassMixinAB mixinAB = ClassMixinAB();
mixinAB.log();
// 成果:MixinB
ClassMixinBA mixinBA = ClassMixinBA();
mixinBA.log();
// 成果:MixinA
}
经过上面2个代码样例,根本能够判别:Mixin处理二义性的办法十分粗犷,后边Mixin掩盖前面Mixin!!!
Mixin运用场景:打印State生命周期日志
Mixin经过代码复用,能够运用在许多的运用场景。下面代码样例,能够在Flutter组件生命周期逻辑履行之后,打印呼应的日志。
样例代码:LogStateMixin经过on
关键字限制/承继了State类型,内部的办法,均经过super代理了State的内容,一起打印相应的日志。
mixin LogStateMixin<T extends StatefulWidget> on State<T> {
@override
void initState() {
super.initState();
print("====initState====");
}
@override
void dispose() {
super.dispose();
print("====dispose====");
}
// 其他办法......
}
在但凡想要监听组件的生命周期的组件中,能够运用上面的Mixin即可,无其他侵入代码,特别适合在Flutter运用研制过程中,经过日志观测组件的生命周期:
class _MinePageState extends State<MinePage> with LogStateMixin<MinePage>
// 我的页面逻辑,无需关怀日志....
}
这样在页面初始化、毁掉的时分,打印呼应的日志。
我的本博客原地址:https://ntopic.cn/p/2023093001