当前位置:首页 > 后端开发 > 正文内容

Flutter/Dart第05天:Dart特别特性Mixin详解

邻居的猫1个月前 (12-09)后端开发850

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的运用有哪些束缚呢?

  1. Mixin不能承继其他Mixin或许抽象类。
  2. 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一起收效,包含如下:

  1. Mixin不支持extends承继其他类和with复用其他Mixin,因而mixin class也不能有extends承继其他类和with复用其他Mixin
  2. 一般类不支持经过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


扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=278

分享给朋友:

“Flutter/Dart第05天:Dart特别特性Mixin详解” 的相关文章

Flutter/Dart第19天:Dart高档特性之扩展办法(Extension methods)

Flutter/Dart第19天:Dart高档特性之扩展办法(Extension methods)

Dart官方文档:https://dart.dev/language/extension-methods 重要说明:本博客依据Dart官网文档,但并不是简略的对官网进行翻译,在掩盖中心功用情况下,我会依据个人研制经历,参加自己的一些扩展问题和场景验证。 扩展办法概述 当咱们运用了一些被广泛运用的其他...

java图片压缩,Java 图片压缩概述

java图片压缩,Java 图片压缩概述

在Java中,你可以使用Java图像处理库(如Java ImageIO)来压缩图片。以下是一个简单的例子,展示了如何使用Java来压缩图片:```javaimport javax.imageio.ImageIO;import java.awt.image.BufferedImage;import j...

java获取当前时间, Java中的日期时间类

在Java中,你可以使用`java.time`包中的类来获取当前时间。以下是获取当前日期和时间的几种方法:1. 使用`LocalDateTime`类:```javaimport java.time.LocalDateTime;public class CurrentTime { public...

python反转字符串, 使用字符串切片反转字符串

字符串 Hello, World! 的反转是 !dlroW ,olleH。 Python字符串反转:多种方法详解在编程中,字符串反转是一个常见的操作,它涉及到将字符串中的字符顺序颠倒。Python作为一门简洁而强大的语言,提供了多种方法来实现这一功能。本文将详细介绍Python中反转字符串的几种常用...

on-the-go,现代生活的节奏与便捷生活方式

“Onthego”是一个常用的英语短语,其含义和用法如下:1. 基本含义: 忙碌和活跃:用来描述一个人总是处于忙碌或活跃的状态,没有空闲时间。 中文翻译:忙个不停的、特别忙的、总是在生产中或处于生产过程中。2. 用法: 在日常交流中,onthego常用来形容那些总是忙碌、时间紧迫的...

verilog语言入门教程,verilog语言

如果你想学习Verilog语言,这里有几篇入门教程可以参考:1. 菜鸟教程 Verilog 教程 这篇教程介绍了Verilog HDL的基本语法、设计层次和仿真方法,适合初学者和进阶者。通过实例和代码,你可以学习如何用Verilog设计数字电路,如4位宽10进制计数器。 2. CSDN...