什么是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,
代码根本运行不起来~~~
是不是很好用哈~~~