【Flutter】mixin简单使用

序言

之前有个技改任务,把司机学堂代码由原生转到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 {
  @override
  music() {
    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");
  }
}

再次打印

就会调用本类的方法

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过本课程学习您可以学习到Dart语言如下知识:第1章 Dart语言概述:Dart语言简介、Dart语言支持平台开发、Flutter为什么选择Dart语言。第2章 开发环境搭建:下载Dart SDK、Windows下安装Dart SDK、macOS下安装Dart SDK、Visual Studio Code开发工具、IntelliJ IDEA开发工具。第3章 完成个Dart程序:动动手写一个HelloWorld、Dart源代码文件组织结构、Visual Studio Code调试Dart代码、IntelliJ IDEA调试Dart代码。第4章 Dart语法基础:标识符、关键字、变量、常量、注释、库。第5章 Dart数据类型:数值类型、字符串、数据类型相互转换、布尔类型和枚举类型第6章 运算符:算术运算符、算术赋值运算符、关系运算符、逻辑运算符、位运算符、条件运算符、类型检查运算符。第7章 控制语句:分支语句、循环语句、跳转语句。第8章 函数:函数声明、可选参数、头等函数(first-class function)、匿名函数。第9章 类:类声明、getter和setter访问器、构造函数、静态变量和静态方法、级联符号。第10章 继承与多态:Dart中的继承实现、调用父类构造函数、成员变量的覆盖(Override)、方法的覆盖(Override)、多态、混入(Mixins)。第11章 抽象类与接口:抽象类、接口、Dart中隐式接口、实现接口。第12章 数据容器:List容器、Set容器、Map容器、泛型。第13章 异常处理:捕获异常、try-on捕获异常、try-catch捕获异常、try-on-catch捕获异常、使用finally代码块、手动抛出异常、自定义异常类。第14章 异步编程:Dart异步处理机制、案例:同步函数实现读取文件、案例:异步函数实现读取文件、Future对象。  
FlutterBoost 是一个开源的 Flutter 插件,它提供了一种在 Flutter 中集成原生页面的方式。FlutterBoost 允许您在 Flutter 应用程序中创建多个独立的页面栈,每个页面栈都可以与原生应用程序中的其他页面栈进行交互。 以下是使用 FlutterBoost 的一些基本步骤: 1. 添加 FlutterBoost 插件到 Flutter 项目中。在 `pubspec.yaml` 文件中添加以下代码: ```yaml dependencies: flutter_boost: git: url: https://github.com/alibaba/flutter_boost.git ``` 2. 在您的 Flutter 应用程序中初始化 FlutterBoost 插件。您可以在应用程序的入口处(例如 `main.dart` 文件)添加以下代码: ```dart import 'package:flutter_boost/flutter_boost.dart'; void main() { FlutterBoost.singleton.registerPageBuilders({ 'sample://firstPage': (pageName, params, _) => FirstRouteWidget(), 'sample://secondPage': (pageName, params, _) => SecondRouteWidget(), }); runApp(MyApp()); } ``` 在此示例中,我们注册了两个页面生成器,它们分别与名为 `sample://firstPage` 和 `sample://secondPage` 的页面 URL 对应。当在原生应用程序中调用这些页面时,FlutterBoost 将使用这些生成器来构建对应的 Flutter 页面。 3. 在原生应用程序中调用 Flutter 页面。您可以使用以下代码从原生应用程序中启动 Flutter 页面: ```swift let url = "sample://firstPage" let params = ["title": "Hello World"] FlutterBoost.instance().open(url, urlParams: params) ``` 在此示例中,我们调用名为 `sample://firstPage` 的 Flutter 页面,并将一个名为 `title` 的参数传递给它。 4. 在 Flutter 页面中处理参数。您可以使用以下代码在 Flutter 页面中获取传递的参数: ```dart import 'package:flutter_boost/flutter_boost.dart'; class FirstRouteWidget extends StatefulWidget { FirstRouteWidget({Key key, this.params}) : super(key: key); final Map params; @override _FirstRouteWidgetState createState() => _FirstRouteWidgetState(); } class _FirstRouteWidgetState extends State<FirstRouteWidget> { String _title; @override void initState() { super.initState(); _title = widget.params['title']; } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(_title), ), body: Center( child: Text('Hello World'), ), ); } } ``` 在此示例中,我们将传递的 `title` 参数存储在 `_title` 变量中,并在应用程序栏中显示它。 这些是使用 FlutterBoost 的一些基本步骤。您可以在 FlutterBoost 的 GitHub 存储库中找到更多详细信息和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值