[搬運]Dart之列舉中使用擴充套件

HalloWorld發表於2020-07-21

原文在這裡

正文

如何在Dart中使用Extension寫出乾淨整潔的程式碼?

[搬運]Dart之列舉中使用擴充套件

Dart最近宣佈支援Extension方法,你也可以在專案中使用這個牛X的功能了!!!本文旨在展示我是如何在專案中使用Extension方法的。

在我的Flutter專案中,我經常使用Enum,但是整合EnumExtension方法會讓程式碼變得更簡潔易讀。

假設你寫了一個Enum,然後你根據這個Enum的值返回不同的文字。在以前,我會使用IIFEmedia post)在widget中使用switch語句,在函式表示式中呼叫匿名方法,雖然在Dart中這很常用,但這種模式會產生很多面條式程式碼,如下例所示。另外,如果需要在其他地方新增相同的文字,則必須複製整個程式碼片段,而不是僅僅進行函式呼叫。

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';
  }
}()),
複製程式碼

另外,如果你想要根據Enum值修改文字,你甚至需要給PrimaryColorSecondaryColor再寫一個IIFE。

現在,你不用為此而煩惱,你只需要擴充套件你的Enum並實現一個擴充套件方法就可以搞定這一切。使用這種方式可以實現相同的功能,並且程式碼更簡潔易讀。擴充套件列舉對Java開發者非常重要,列舉本應支援擴充套件!

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 Foundation中定義的describeEnum()函式從enumEntry.toString()返回值中中剝離了列舉類名,僅返回了列舉值的字串。我提供了一個自定義的替代實現,你可以將它用於其他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);
}
複製程式碼

在CodePen中執行示例程式碼

在示例程式碼中,我給列舉擴充套件了4個方法displayTitle(), displayColorChangeText(), color(), 和getRandomSelectedColor()。當呼叫displayTitle()方法時,你會發現明顯比IIFE更模組化,更簡潔,更新列舉新增新列舉值也會變得更加容易,新增新的擴充套件方法也非常容易,比如新增color()函式來改變文字顏色,只需要在Extension新增新方法就可以了。

Flutter Gallery中使用handling category demos來演示Enum中使用Extension

結束語

Extension MethodDart中的一個強大工具,使用它你可以寫出更簡潔易讀、更易擴充套件的程式碼。

學習更多的Dart設計模式,請看3 Cool Dart Patterns for everyday programming in Flutter

相關文章