《Flutter进阶》灵活使用extension

什么是extension??
简单来说extension可以让开发者灵活扩展基础类的方法,编译后就可以在任何地方使用该方法。

这是一个超好用的功能:
1.可以简化代码,减少嵌套,
2.提高代码安全性,同时又不降低代码可读性。

用代码举几个例子:

extension WidgetExtension on Widget {
  /**
   * 给widget增加expanded包裹
   */
  Widget get e {
    return Expanded(
      child: this,
    );
  }
  /**
   * 当条件为true的时候展示widget
   */
  Widget when(bool showWidget) {
    return showWidget ? this : Container();
  }

  /**
   * 为widget增加一个onClick
   */
  Widget onClick(callback){
    return InkWell(
      child:this,
      onTap:callback,
    );
  }
}

扩展了Widget的方法,
widge.e表示给widget包括一层Expand
widget.onClick表示给widget增加一个onclick方法

这样在其他地方可以直接:
widget.e轻松实现Expand,还减少了Expand嵌套.

     Row(
            children: <Widget>[
              LoginItem(
                maxems: 6,
                controller: _controllerCode,
                callback: _onPdwTextChange,
                hintText: loginType == 1 ? "请输入验证码" : "请输入密码",
              ).e,//这里节省了Expand 嵌套
              SendMgsWidget(type: 5, phoneControl: _controllerName)
                  .when(loginType == 1)
                  //这里执行了条件显示,当loginType==1验证码登录的时候,才显示发送验证码
            ],
          )

在这里插入图片描述

又比如下面这段代码

  @override
  Widget buildContent() => Column(
        children: <Widget>[
          100.v,
          _buildLogoPart(),
          45.v,
          _buildInputPart(),
          30.v,
          _buildLoginBtn(),
          20.v,
          _buildChangeLoginType(),
          30.v,
          _buildThirdLogin(),
          30.v,
          _buildUserRolePart(),
          30.v
        ],
      );

100.v 45.v,30.v…都代表生成一个为100/45/30的纵向间距
实现方案则是扩展num类:

/***************************
 * num  方法扩展
 ***************************/
extension NumExtension on num {

  /**
   * 获取一个纵向间距 divider
   */
  Widget get v {
    return SizedBox(height: a);
  }

  /**
   * 获取一个textsize 为自动适配的 TextStyle
   */
  TextStyle get ts {
    return TextStyle(fontSize: as);
  }

  /**
   * auto resize  自动根据屏幕宽高适配
   */
  double get a {
    return ScreenUtil.getInstance().getWidth(toDouble());
  }

  /**
   * auto resize sp 自动根据屏幕宽高适配
   */
  double get as {
    return ScreenUtil.getInstance().getSp(toDouble());
  }
}

其他更多功能 基础数据类型的转换,公共业务的扩展,例如log打印 , dialog提醒等等,
都可以写扩展,
无限想象空间大家可以自己探索 ,
按照各自习惯来写就行了,是不是超级方便~~~

为什么说提高了安全性同时不降低可读性.
首先很多人认为降低了可读性,
例如下面的代码生成了一个TextStyle(fontSize:ScreenUtils.getSP(16),color:UI.cl00),并且透明度为25%,
通过扩展后的写法是:
16.ts.c(color.a(25))
在这里插入图片描述

乍一看似乎对于新接手代码的人好像可读性差,
但是实际上这样写缺是非常清晰的.
16.ts 生成了一个fontSize=16的TextStyle,
c 是扩展了TextStyle方法,其实是TextStyle.apply方法的缩写扩展,
color.a是对color进行alpha控制.
只要项目内的人理解过一次,
读起来还是很简单的~~~

最关键的是安全性 ,
所有extension写在一个dart文件下,
这个extension.dart与源码分开存储,
这样即使源码泄露了,
也根本不用担心,
因为丢了extension.dart,
代码根本运行不起来~~~

是不是很好用哈~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值