前语

在做 iOS 开发的时分,Objective-C 言语有个特性,叫 Category,也便是能够在不修正原有类代码的基础上扩展一个类的方法或静态属性。Dart 言语同样借鉴了这种规划,仅仅换了个更恰当的说法,叫做 extension。经过 extension 能够以无侵入的方法扩展一个已有的类,然后不影响其他运用这个类的代码。本篇来介绍 extension 的运用以及典型的运用。

extension 介绍

要运用Dart 的 extension 扩展类很简单,只需求新增一个 Dart 文件,然后按下面的方法声明即可:

extension [扩展称号] on [已有类名] {
  static const [静态属性] = ...;
  [已有类名] get [get属性] = ...;
  [方法名](参数) {
    //方法体
  }
}

这儿需求注意,extension不支持扩展非静态属性。

运用之扩展色彩

咱们在 App 中常常会依据规划规范设置主题色、辅助色、标题字体色彩、分割线色彩等等。尽管能够经过 Theme 来完成,可是 Theme依赖于 Context。咱们也能够界说一个主体色彩扩展,来界说咱们所需求的色彩,当规划稿更改色彩时,只需求更改这个色彩扩展就能够完成一切色彩的修正。下面是示例代码:

extension ThemeColor on Color {
  static const primaryColor = Color(0xFF0990EC);
  static const lineColor = Color(0xFFEEEEEE);
  //反色
  Color get reverseColor {
    return Color.fromARGB(
      alpha,
      255 - red,
      255 - green,
      255 - blue,
    );
  }
	// 将色彩转换为16进制字符串表示,例如:#FFFF0000
  String toHex() {
    return '#${value.toRadixString(16).padLeft(6, 'F').toUpperCase()}';
  }
}

运用之屏幕适配

规划师提供的规划稿通常会按照某一个屏幕的宽度尺度规划,例如375是规划师常用的一个规划宽度。可是实际屏幕的宽度却形形色色,这个时分就需求做屏幕适配。在 Flutter 屏幕适配插件中,screen_util 是运用最为广泛(中文文档:github.com/OpenFlutter…)。假如咱们去看里面的源码,就会发现里面就用到了extension,其中典型的便是扩展了 num 类。

extension SizeExtension on num {
  ///[ScreenUtil.setWidth]
  double get w => ScreenUtil().setWidth(this);
  ///[ScreenUtil.setHeight]
  double get h => ScreenUtil().setHeight(this);
  ///[ScreenUtil.radius]
  double get r => ScreenUtil().radius(this);
  ///[ScreenUtil.diagonal]
  double get dg => ScreenUtil().diagonal(this);
  ///[ScreenUtil.diameter]
  double get dm => ScreenUtil().diameter(this);
  ///[ScreenUtil.setSp]
  double get sp => ScreenUtil().setSp(this);
  //...
}

原理上其实便是用实际屏幕尺度与规划稿尺度计算份额,然后再将这个份额乘以界说组件尺度的数值。比方20.w,实际上便是20乘以换算的份额得到适配后的宽度。典型的例子便是一个固定宽度的 Container,屏幕越大应该宽度越宽,这样两边的留白也不至于过宽。
这儿咱们还能够发现,假如是在父类上进行扩展,那么这些扩展对子类也是能够收效的。比方上面扩展的是 num 类,那么关于 doubleint 这样的子类也是能够用 num 类的扩展方法的。

运用之简化校验

第三类运用便是表单校验,实际上大部分都是字符串校验,那么咱们能够编写一个字符串校验扩展类,将咱们用到的字符串校验集中在一起,如下所示。

extension StringValidator on String {
  bool get isEmail {
    //邮箱校验逻辑
  }
  bool get isIdNumber {
    //身份证号校验
  }
  bool get isMobile {
    //手机号校验
  }
  //...
}

这样用起来会更便利,如下所示:

if (!email.isEmail) {
  //邮箱校验失利处理
}
if (!mobile.isMobile) {
  //手机号校验失利处理
}

相比单独界说一个校验类,编写静态方法来说,这样的方法的代码显然更加简洁。

总结

代码开发的一个重要准则是“对扩展开放,对修正封闭”。这是由于扩展的代码不会影响已有的事务代码,而修正则会影响一切用到修正部分的代码。运用 extension 就很好地遵从了这一准则,不更改原有的类代码,因此不影响类的原有运用方法。同时,又扩展了类的特性,使得扩展后的代码能够适用特定的场景。假如你在开发 Flutter 的运用中,发现常常要对某个类进行相同的处理,那么或许运用 extension 扩展会是一个更好的选择。

我是岛上码农,微信公众号同名。如有问题能够加本人微信沟通,微信号:island-coder

:觉得有收获请点个赞鼓舞一下!

:收藏文章,便利回看哦!

:评论沟通,互相前进!