[Flutter] 使用Dart Extension,帮你扩充常用类的功能
Flutter 是基于Dart这个语言的。在Dart 2.7 版本中,新加入了一个重要的语法功能,叫做extension。Extension的主要功能给已经存在的类添加新的member function,往里面增加新的函数。通过extension, 我们可以向诸如 Iterable , String 这样的常用类里面增加一些方便的函数。
扩展 String 的功能
我们创建一个文件名为 “string_parser_extension.dart”,其中的内容如下。
extension ParseNumbers on String {
int parseInt() {
return int.parse(this);
}
double parseDouble() {
return double.parse(this);
}
}
需要注意的是,在extension函数中,我们可以通过this来访问string 中原有的其它方法。这里的this指的是当前的string instance。
要使用这两个extension函数,只需要 import ‘{文件路径}:string_parser_extension.dart’ , 然后我们就可以对代码中的 string 类型使用这两个函数了。
final d = '2';
print(d.parseInt());
另外如下的写法也都是可以的:
dynamic v = '1';
print(v.parseInt());
var v = '1';
print(v.parseInt());
也就是说,通过extension来为 String class 增加方便的功能,可以增加服用,简化代码。
扩展 Iterable 的功能
在Dart 与 Flutter 中,Iterable 是最常用的一个类。它里面已经有需要方便的功能。但有的常用功能需要联合使用多个方法,比较麻烦。我们可以通过extension来构造一些方便的方法。
extension IterableExtension<E> on Iterable<E> {
/// 返回第一个元素。如果内容为空,返回null.
E get firstOrNull => isEmpty ? null : first;
/// 返回第一个符合条件的元素。如果不存在则返回null.
E firstOrNullWhere(bool Function(E element) test) {
return firstWhere(test, orElse: () => null);
}
/// 过滤掉所有的 null .
Iterable<E> get excludingNulls => where((e) => e != null);
}
如上图所示,Iterable本身是包含类型E的,我们在extension的构造中,也可以知道当前的类型E。
同时,extension的构造中直接调用了Iterable 原本的 isEmpty , first , firstWhere 方法。这是省略了"this."的写法。extension 的构造中是可以调用 “on” 后面的类的所有方法的。
在使用IterableExtension 时,所有Iterable的子类也都会创建相应的 extension 方法,比如 List , Map , Set 等等。
下面的代码即是使用样例:
import 'iterable_extension.dart';
final list = [1, 2, 3, 4];
final excludedNullList = list.excludingNulls();
final emptyList = [];
final firstNull = emptyList.firstOrNull;
推荐的Extension包
社区里面有的大神做了一些很有用的 example包,比如 时间扩展(Time Extension) ,国际化扩展包 (i18n extension) ,大家可以拿来使用,提高自己团队的开发效率。
- 国际化包 i18n extension (https://pub.dev/packages/i18n_extension)
- 时间扩展包 Time extension (https://pub.dev/packages/time)
- Dartx extension 这个里面是对dart的常用类型提供了很多便捷函数。看看里面的文档,很多extension都不需要自己实现啦 (https://pub.dev/packages/dartx)