• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Fluttermixin使用

武飞扬头像
RockyFung
帮助1

序言

之前有个技改任务,把司机学堂代码由原生转到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。

  1.  
    // 汽车
  2.  
    class Vehicle {
  3.  
    drive(){
  4.  
    print("驾驶");
  5.  
    }
  6.  
    }
  7.  
     
  8.  
    // 汽车A
  9.  
    class VehicleA extends Vehicle{
  10.  
     
  11.  
    }
  12.  
    // 汽车B
  13.  
    class VehicleB extends Vehicle {
  14.  
     
  15.  
    }
学新通

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

  1.  
    VehicleA().drive();
  2.  
    VehicleB().drive();

使用mixin

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

  1.  
    mixin MusicMixin{
  2.  
    music(){
  3.  
    print("放音乐");
  4.  
    }
  5.  
    }

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

  1.  
    // 汽车A
  2.  
    class VehicleA extends Vehicle with MusicMixin {
  3.  
     
  4.  
    }
  5.  
    // 汽车B
  6.  
    class VehicleB extends Vehicle with MusicMixin {
  7.  
     
  8.  
    }

调用方法:

  1.  
    VehicleA().music();
  2.  
    VehicleB().music();

重写mixin方法

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

  1.  
    // 汽车A
  2.  
    class VehicleA extends Vehicle with MusicMixin {
  3.  
    @override
  4.  
    music() {
  5.  
    return super.music();
  6.  
    }
  7.  
    }

使用多个mixin

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

  1.  
    mixin MusicMixin{
  2.  
    music(){
  3.  
    print("放音乐");
  4.  
    }
  5.  
    }
  6.  
     
  7.  
    mixin GasMixin{
  8.  
    gas(){
  9.  
    print("加汽油");
  10.  
    }
  11.  
    }
  12.  
     
  13.  
    mixin ChargeMixin{
  14.  
    charge(){
  15.  
    print("汽车充电");
  16.  
    }
  17.  
    }
学新通

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

  1.  
    // 汽车A
  2.  
    class VehicleA extends Vehicle with MusicMixin, GasMixin {
  3.  
     
  4.  
    }
  5.  
    // 汽车B
  6.  
    class VehicleB extends Vehicle with MusicMixin, ChargeMixin{
  7.  
     
  8.  
    }

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

  1.  
    VehicleA().music();
  2.  
    VehicleA().gas();
  3.  
    VehicleB().music();
  4.  
    VehicleB().charge();

特定条件mixin

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

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

  1.  
    / 飞机
  2.  
    class Plane{}
  3.  
     
  4.  
     
  5.  
    // 飞机A
  6.  
    class PlaneA extends Plane with PlaneMixin{
  7.  
     
  8.  
    }

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

  1.  
    mixin PlaneMixin on Plane {
  2.  
    fly(){
  3.  
    print("起飞");
  4.  
    }
  5.  
    }

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

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

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

学新通

多个相同方法的mixin优先级

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

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

  1.  
    mixin MusicMixin{
  2.  
    music(){
  3.  
    print("放音乐");
  4.  
    }
  5.  
    aaa(){
  6.  
    print("Music aaa");
  7.  
    }
  8.  
    }
  9.  
     
  10.  
    mixin GasMixin{
  11.  
    gas(){
  12.  
    print("加汽油");
  13.  
    }
  14.  
    aaa(){
  15.  
    print("Gas aaa");
  16.  
    }
  17.  
    }
学新通

还是原来的多个混入

  1.  
    // 汽车A
  2.  
    class VehicleA extends Vehicle with MusicMixin, GasMixin {
  3.  
     
  4.  
    }

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

学新通

打印了 GasMixin中的aaa方法。

再换下导入顺序看看:

  1.  
    // 汽车A
  2.  
    class VehicleA extends Vehicle with GasMixin, MusicMixin {
  3.  
     
  4.  
    }

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

 学新通

打印了 MusicMixin中的aaa方法。

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

  1.  
    // 汽车A
  2.  
    class VehicleA extends Vehicle with GasMixin, MusicMixin {
  3.  
    aaa(){
  4.  
    print("VehicleA aaa");
  5.  
    }
  6.  
    }

再次打印

学新通

就会调用本类的方法

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgjeace
系列文章
更多 icon
同类精品
更多 icon
继续加载