使用Extensions的枚举写出优雅的代码
如何使用Dart中的Extensions
写出优雅的代码?
Dart 2.7
之后已经支持了extensions
方法,那就意味着你现在就可以优雅的使用了,本文介绍一下我是如何使用的…
我经常在枚举中使用extensions
,来获取不同枚举对应得文本。假如在小部件中需要获得不同得枚举值的文本,那么看一下下边的例子,假如你在其他地方使用的话直接拷贝过去稍微改一下即可。
Text((){
switch (selectedColor) {
case SelectedColor.PrimaryColor:
return 'This is the Primary Color';
case SelectedColor.SecondaryColor:
return 'This is the Secondary Color';
default:
return 'SelectedScheme Title is null';
}
}()),
Text((){
switch (selectedColor) {
case SelectedColor.PrimaryColor:
return 'This is the Primary Color';
case SelectedColor.SecondaryColor:
return 'This is the Secondary Color';
default:
return 'SelectedScheme Title is null';
}
}()),
假如你可以直接进去到枚举内部也不需要这样,只需要在枚举中增加一个extensions
,看一下我的代码
enum SelectedColor {
primaryColor,
secondaryColor,
}
extension SelectedColorExtension on SelectedColor {
String get name => describeEnum(this);
String get displayTitle {
switch (this) {
case SelectedColor.PrimaryColor:
return 'This is the Primary Color';
case SelectedColor.SecondaryColor:
return 'This is the Secondary Color';
default:
return 'SelectedScheme Title is null';
}
}
}
在Flutter基础库中定义的describeEnum()
函数从enumEntry.toString()
中剥离枚举类名称。 如果您想在Flutter
开发之外将其用于其他Dart
项目,我将提供以下代码:
String describeEnum(Object enumEntry) {
final String description = enumEntry.toString();
final int indexOfDot = description.indexOf('.');
assert(indexOfDot != -1 && indexOfDot < description.length - 1);
return description.substring(indexOfDot + 1);
}
使用四个方法扩展了枚举:displayTitle()
,displayColorChangeText()
,color()
和getRandomSelectedColor()
。 在Flutter
代码中调用
displayTitle()
方法时,您会看到该代码是模块化的,与IIFE相比,它更干净。 另外,如果您决定在枚举中添加另一个枚举变量,由于所有代码都在扩展名之内,因此更新起来更容易。 当调用color()
方法来更改文本颜色时,可以看到这一点。 如果我想使用IIFE
进行此操作,则代码将很快变得复杂。 将来也可以通过扩展来添加方法。
最后
扩展方法是Dart
提供的功能强大的工具。 通过同时使用枚举和扩展方法,您可以拥有更干净,更可扩展的代码。
在3种Cool Dart
模式中了解有关有用的Dart
模式的更多信息,以便在Flutter
中进行日常编程。
如果你有更多得技术问题,可以在github找到我!
翻译: fgyong