Dart 使用Extensions的枚举写出优雅的代码

870 阅读1分钟

使用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