美文网首页
dart扩展函数的几种用法

dart扩展函数的几种用法

作者: 健健可迪仔 | 来源:发表于2020-04-20 22:18 被阅读0次

简介:
从2.7及以上的dart版本开始,让人殷切期待的扩展函数来了。当你想扩展别人的函数库或者官方的SDK,如果通过更改api的方式则意味着你需要重建一个代码分支,维护一个分支是相当麻烦的事情, 如果这个时候使用扩展方法将是非常方便的。扩展不仅可以定义方法,还可以定义getter,setter和operator。虽然扩展方法中不能用于用dynamic类型,但却支持更强大的泛型扩展。总有人吐槽flutter开发widget嵌套太深的问题,扩展函数的使用能够让代码的结构变得极为简洁,加上泛型扩展的使用可以使代码链式调用一链到底。

原理:
扩展函数调用起来跟原生方法一样自然,使用起来也非常方便,但是这样的用法会不会带来性能方面的问题呢?其实扩展函数的本质是针对接收者的静态类型进行了解析,即扩展方法是静态解析的,扩展函数的实现非常简单,它没有修改接受者类型的成员,仅仅是通过静态方法来实现的,它们与调用静态函数一样快速。
废话少说,下面以本人开发中的使用的经验举几个例子加以说明。


widget扩展:
extension WidgetExt on Widget {
  Widget padding(EdgeInsetsGeometry padding) {
    return Padding(
      child: this,
      padding: padding,
    );
  }

  Material gesture({
    GestureTapCallback onTap,
    GestureTapCallback onDoubleTap,
    GestureLongPressCallback onLongPress,
  }) {
    return Material(
      child: InkWell(
        child: this,
        onTap: onTap,
        onDoubleTap: onDoubleTap,
        onLongPress: onLongPress,
      ),
    );
  }
}

String扩展:
extension StringExt on String {
  double toDouble() {
    return double.parse(this);
  }
  int toInt() {
    return int.parse(this);
  }
  bool isMobile(){
    return RegExp(r'^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8])|(19)[0-9])\d{8}$').hasMatch(this);
  }
}

Object扩展:
extension ObjectExt on Object {
  bool isNullOrEmpty() {
    if (this is String)
      return (this as String).isEmpty;
    else if (this is Iterable) return (this as Iterable).isEmpty;
    return this == null;
  }
}

bool扩展:
extension BoolExt on bool {
  bool not() {
    return !this;
  }

  bool and(bool val) {
    return this && val;
  }

  bool or(bool val) {
    return this || val;
  }
}

泛型扩展:
extension AllExt<T> on T {
  T apply(f(T e)) {
    f(this);
    return this;
  }

  R let<R>(R f(T e)) {
    return f(this);
  }
}

调用示例如下:仅简单举几个调用例子,其余的调用有兴趣者自行尝试。

实现单层没有嵌的padding和点击事件

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            )
                    .padding(EdgeInsets.all(10))
                    .gesture(onTap: () {
              
            }),
          ],
        ),
      ),

实现String正则的判断

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              '13646176072'.isMobile()?"手机号":"不是手机号",
            ),
          ],
        ),
      ),

bool类型的链式调用

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              ['13646176072', "fgdgdfgdf", 'trtreter']
                  .isNullOrEmpty()
                  .not()
                  .and(true)
                  .or(false)
                  .toString(),
            ),
          ],
        ),
      ),

泛型扩展的链式调用:这个用法非常值得一提,在原生开发中kotlin的语法糖是相当牛掰的,kotlin能够使代码的编写链成一整个链而不使用一个中间变量,这样使得代码优雅,封装的更完美。幸运的是dart虽然没有提供很多的语法糖,但却提供了泛型扩展函数,我们可以依此自定义非常强大的语法糖,调用示例如下,经过层层无聊的转化得到一个字符串而没有定义一个函数,也没有中间变量造成变量污染:

      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
                    People(11, 1, 30)
             .apply((val) {
              val.introduce = "我今年${val.age}${val.sex}${val.weight}";
            }).let((val) {
              if (val.sex == 1) return Monkey(11, 0, 30);
              return Monkey(11, 1, 30);
            }).let((val) {
              if (val.sex == 1) return "大猴子";
              return "程序猿";
            }).let((val) {
              return "整这么多干啥呢,好麻烦啊";
            })),
          ],
        ),
      ),

通过以上示例可以看出扩展函数是很有可玩性的,她能大大提高代码质量,让编程变得有趣,何不一起来探讨探讨呢?

相关文章

  • dart扩展函数的几种用法

    简介:从2.7及以上的dart版本开始,让人殷切期待的扩展函数来了。当你想扩展别人的函数库或者官方的SDK,如果通...

  • python程序扩展名

    扩展名 在写Python程序时我们常见的扩展名是py, pyc,其实还有其他几种扩展名。下面是几种扩展名的用法。 ...

  • Dart 如何正确使用构造函数?

    前言 Dart 语言的构造函数和其他语言会有些不同,我们列举一下 Dart 中的构造函数的几种形式。 这里比较容易...

  • Kotlin实战之run, with, let, also ,

    with和其它通用扩展函数 with的用法和其它通用的扩展函数的用法有区别,对于下面这段代码做的是同样一件事。它们...

  • 新2019计划:python学习-函数【5】

    函数用法 本篇章,主要介绍函数的几种用法,包括传参数、实参形参、不同参数形式(位置实参、关键字实参、任意数量的实参...

  • IF函数的四种用法

    Excel中有很多很实用的Excel函数,今天我们来说说IF函数!你知道IF函数有几种用法吗? 一、判断是否合格(...

  • MySQL拼接函数CONCAT的使用心得

    一、concat函数相关的几种用法 1-1、函数:concat(str1,str2,…) concat 函数一般用...

  • kotlin笔记

    需要记住的用法。 内联函数之let,with,run,apply,also let let扩展函数的实际上是一个作...

  • linux下使用phpize编译安装mcrypt扩展 转载

    PHP除了自带的几种加密函数外,还有功能更全面的PHP加密扩展库Mcrypt和Mhash。 其中,Mcrypt扩展...

  • 自定义函数

    自定义函数用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法...

网友评论

      本文标题:dart扩展函数的几种用法

      本文链接:https://www.haomeiwen.com/subject/kyksihtx.html