【Flutter】mixin简单使用
创始人
2024-02-12 00:14:58

序言

之前有个技改任务,把司机学堂代码由原生转到Flutter。过程中遇到一个问题,学堂资料有pdf、视频、和图片,三种学习都会有几个共同的方法,比如学习进度更新、弹窗提示、完成接口调用等。在iOS中是用协议方法来实现,方法公用,那在Flutter中是否有相同的方法呢?

mixin

官方定义:

Mixins are a way of reusing a class’s code in multiple class hierarchies.

Mixins 是一种在多个类层次结构中重用类代码的方法。

官方文档翻译如下:

在面向对象的编程语言中,mixin(或mix-in)是一个类,其中包含供其他类使用的方法,而不必成为其他类的父类。 这些其他类如何获得对mixin方法的访问权限取决于语言。 混合素有时被描述为“包含”而不是“继承”。

Mixins鼓励代码重用,并且可用于避免多重继承可能导致的继承歧义,或解决语言中对多重继承的支持不足的问题。 混合也可以看作是已实现方法的接口。 此模式是强制执行依赖关系反转原理的示例。

看文档描述,和iOS的协议方法差不多,下面看下如何使用。

mixin的具体使用

首先定义个Vehicle类,内部有个驾驶的方法。然后有2个类继承Vehicle。

// 汽车
class Vehicle {drive(){print("驾驶");}
}// 汽车A
class VehicleA extends Vehicle{}
// 汽车B
class VehicleB extends Vehicle {}

这2个类继承自Vehicle,所以都可以调用driver方法,这个和原生一样就简单过了。

 VehicleA().drive();VehicleB().drive();

使用mixin

定义一个通用功能,放音乐,使用mixin来实现。

mixin MusicMixin{music(){print("放音乐");}
}

VehicleA和VehicleB都使用with关键字,混入MusicMixin,就可以调用听音乐方法。

// 汽车A
class VehicleA extends Vehicle with MusicMixin {}
// 汽车B
class VehicleB extends Vehicle with MusicMixin {}

调用方法:

VehicleA().music();
VehicleB().music();

重写mixin方法

和协议一样,在本类中也可以重写混入中的方法:

// 汽车A
class VehicleA extends Vehicle with MusicMixin {@overridemusic() {return super.music();}
}

使用多个mixin

汽车有可能还会有加油,充电,自动驾驶等功能。定义成mixin类。

mixin MusicMixin{music(){print("放音乐");}
}mixin GasMixin{gas(){print("加汽油");}
}mixin ChargeMixin{charge(){print("汽车充电");}
}

汽车A是油车所以需要加油,使用GasMixin。而汽车B是电车需要充电,使用ChargeMixin。

// 汽车A
class VehicleA extends Vehicle with MusicMixin, GasMixin {}
// 汽车B
class VehicleB extends Vehicle with MusicMixin, ChargeMixin{}

这样,A和B除了听音乐,还分别可以使用加油、充电的方法。

VehicleA().music();
VehicleA().gas();
VehicleB().music();
VehicleB().charge();

特定条件mixin

特定调价需要使用关键字on,后面加上限定的类。来表示该mixin只能这个类及其子类使用。

新增一个Plan类,创建一个PlanA集成自Plan类。

/ 飞机
class Plane{}// 飞机A
class PlaneA extends Plane with PlaneMixin{}

  创建一个PlaneMixin的混入类,加上关键字on,表示该mixin只能Plan类及其子类使用。

mixin PlaneMixin on Plane {fly(){print("起飞");}
}

使用和上面一样,PlanA混入PlaneMixin,PlanA就可以使用fly方法了。

// 飞机A
class PlaneA extends Plane with PlaneMixin{}
PlaneA().fly();

其他类使用该mixin就会报错:

 

多个相同方法的mixin优先级

有可能混入多个mixin类,会有重复方法定义,会使用哪个mixin里的方法呢?

在MusicMixin和GasMixin中都定义一个aaa方法,并且打印不同日志。

mixin MusicMixin{music(){print("放音乐");}aaa(){print("Music aaa");}
}mixin GasMixin{gas(){print("加汽油");}aaa(){print("Gas aaa");}
}

还是原来的多个混入

// 汽车A
class VehicleA extends Vehicle with MusicMixin, GasMixin {}

调用VehicleA().aaa(); 会打印哪个日志呢?

打印了 GasMixin中的aaa方法。

再换下导入顺序看看:

// 汽车A
class VehicleA extends Vehicle with GasMixin, MusicMixin {}

调用VehicleA().aaa(); 会打印哪个日志呢?

 

打印了 MusicMixin中的aaa方法。

如果在本类中也有相同方法呢?

// 汽车A
class VehicleA extends Vehicle with GasMixin, MusicMixin {aaa(){print("VehicleA aaa");}
}

再次打印

就会调用本类的方法

多个方法相同的混入,后面导入的会覆盖前面导入的方法。如果本类也有相同方法,优先本类中的方法。

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...