美文网首页Flutter
Dart extension之扩展方法

Dart extension之扩展方法

作者: 向日花开 | 来源:发表于2020-08-16 09:43 被阅读0次

    今早无意间看到了 Dart 居然也支持 Api 的扩展,感觉就好像发现了新大陆,之前写的好多转换方法都可以换一个更简洁,更优雅的写法。

    这么好的点当然要记录一下,同时也分享给各位亲。

    Dart 扩展需要关键词:extension。这个关键字只有在 Dart 版本 2.7 及其以上才支持。所以请确保你工程项目中 pubspec.yaml 文件中:

    environment:
    sdk: ">=2.7.0 <3.0.0"
    

    如果你之前的是老项目,修改了 pubspec.yaml,执行 pub get 之后,重启 IDE 之后设置才会生效。看一下 extension 的用法。超级简单。

    形如:

    extension <extension name> on <type> {
      (<member definition>)*
    }
    
    

    示例:

    extension StringExtension1 on String {
      //字符转换成Color对象
      toColor() {
        var hexColor = this.replaceAll("#", "");
        if (hexColor.length == 6) {
          hexColor = "FF" + hexColor;
        }
        if (hexColor.length == 8) {
          return Color(int.parse("0x$hexColor"));
        }
      }
    
      //字符转int
      parseInt() {
        return int.parse(this);
      }
    }
    
    extension DateTimeExtension on DateTime {
      toFormatString() {
        DateFormat dateFormat = new DateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(this);
      }
    }
    
    

    扩展不仅可以定义方法,还可以定义,setter,getter,operator。如果要使用这些扩展方法,只要引用导入对应的 dart 文件即可。

    import 'util/extensions.dart';//导入
    
    void main() {
      print("#90F7EC".toColor());
      print("23".parseInt());
    }
    
    

    这种写法是不是超级简单。。。

    这种扩展对于申明为动态类型的变量不可使用。也就是:

      dynamic h = "78";
      print(h.parseInt()); //Runtime exception: NoSuchMethodError
    

    运行报错。

    如果你定义了很多扩展,扩展方法之间有同名冲突,可以用 hide,show,as 限制,选择你想用扩展方法。

    import 'util/extensions.dart';
    import 'util/extensions1.dart' hide StringExtension1;
    import 'util/extensions.dart' as ex1;
    
    print("#90F7EC".toColor());
    print("23".parseInt());
    print(ex1.DateTimeExtension(DateTime.now()).toFormatString());
    
    

    扩展也可以作用于泛型:

    //扩展list的方法
    extension HclList<T> on List<T> {
      //扩展属性
      int get doubleLength => length * 2;
      //扩展操作符
      List<T> operator -() => reversed.toList();
      //一个链表分割成两个
      List<List<T>> split(int at) => <List<T>>[sublist(0, at), sublist(at)];
    }
    

    扩展在 Widget 控件中的应用

    我们会经常有类似控件:

             Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Container(
                    margin: EdgeInsets.all(10),
                    alignment: Alignment.center,
                    child: Text("ZL"),
                  ),
                  Container(
                    margin: EdgeInsets.all(10),
                    alignment: Alignment.center,
                    child: Text("ZL"),
                  ),
                  Container(
                    margin: EdgeInsets.all(10),
                    alignment: Alignment.center,
                    child: Text("ZL"),
                  ),
                ],
              )
    

    好多重复的 Container()是不是?我们可以扩展 一下:

    extension HclWidget on Widget {
      Widget marginAll(double margin) {
        return Container(
          alignment: Alignment.center,
          margin: EdgeInsets.all(margin),
          child: this,
        );
      }
    }
    

    之后我们就可以改成这样:

            Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text("ZL").marginAll(10),
                  Text("ZL").marginAll(10),
                  Text("ZL").marginAll(10),
                ],
              )
    
    

    扩展类的所有代码:

    import 'dart:ui';
    import 'package:flutter/material.dart';
    import 'package:intl/intl.dart';
    
    extension StringExtension on String {
      //字符转换成Color对象
      toColor() {
        var hexColor = this.replaceAll("#", "");
        if (hexColor.length == 6) {
          hexColor = "FF" + hexColor;
        }
        if (hexColor.length == 8) {
          return Color(int.parse("0x$hexColor"));
        }
      }
    
      //字符转int
      parseInt() {
        return int.parse(this);
      }
    }
    
    extension DateTimeExtension on DateTime {
      toFormatString() {
        DateFormat dateFormat = new DateFormat("yyyy-MM-dd HH:mm:ss");
        return dateFormat.format(this);
      }
    }
    
    //扩展list的方法
    extension HclLis<T> on List<T> {
      //扩展属性
      int get doubleLength => length * 2;
    
      //扩展操作符
      List<T> operator -() => reversed.toList();
    
      //一个链表分割成两个
      List<List<T>> split(int at) => <List<T>>[sublist(0, at), sublist(at)];
    }
    
    extension HclWidget on Widget {
      Widget marginAll(double margin) {
        return Container(
          alignment: Alignment.center,
          margin: EdgeInsets.all(margin),
          child: this,
        );
      }
    }
    
    

    相关文章

      网友评论

        本文标题:Dart extension之扩展方法

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