L'utilisation de l'énumération Enum dans le projet Flutter

ExtensionComment écrire du code propre et ordonné dans Dart ?

Dans mes projets Flutter, j'utilise beaucoup Enum, mais les intégrations Enumet Extensionles méthodes rendent le code plus propre et plus facile à lire.

Supposons que vous écriviez un Enum, puis que vous renvoyiez différents textes d'affichage en fonction de la valeur de cet Enum. Dans le passé, l'utilisation d'instructions dans IIFE ( media post ) était utilisée pour appeler des méthodes anonymes dans des expressions de fonction. Bien que cela soit très courant dans Dart, ce modèle produit beaucoup de code spaghetti, comme illustré dans l'exemple suivant. De plus, si vous devez ajouter le même texte ailleurs, vous devez copier l'intégralité de l'extrait de code au lieu de simplement faire un appel de fonction, il y a beaucoup de code dupliqué.widgetswitch

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 SelectedColor {
  primaryColor,
  secondColor,
}

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.secondColor:
        return 'This is the Secondary Color';
      default:
        return 'SelectedScheme Title is null';
    }
  }
   String get displayColorChangeText {
    switch (this) {
      case SelectedColor.primaryColor:
        return 'Change to Secondary Color';
      case SelectedColor.secondColor:
        return 'Change to Primary Color';
      default:
        return 'SelectedScheme is null';
    }
  }

  String describeEnum(Object enumEntry) {
    final String description = enumEntry.toString();
    final int indexOfDot = description.indexOf('.');
    assert(indexOfDot != -1 && indexOfDot < description.length - 1);
    LogUtils().e(description.substring(indexOfDot + 1));
    return description.substring(indexOfDot + 1);
  }
   Color color() {
    switch (this) {
      case SelectedColor.primaryColor:
        return Colors.red;
      case SelectedColor.secondColor:
        return Colors.blue;
      default:
        return Colors.transparent;
    }
  }
}

Maintenant, vous n'avez plus à vous en soucier, il vous suffit d'étendre votre méthode Enumet d'implémenter une méthode d'extension pour tout faire. L'utilisation de cette méthode peut atteindre la même fonction, et le code est plus concis et facile à lire.

Flutter FoundationdescribeEnum()La fonction définie dans enumEntry.toString()supprime le nom de la classe d'énumération de la valeur de retour et renvoie uniquement la chaîne de la valeur d'énumération. Je fournis une implémentation alternative personnalisée que vous pouvez utiliser pour d'autres Dartprojets.

Dans l'exemple de code, j'ai étendu une méthode displayTitle(), . Lors de l'appel de displayTitle()méthodes, vous constaterez qu'il est nettement plus modulaire et concis que IIFE, et il sera plus facile de mettre à jour l'énumération pour ajouter de nouvelles valeurs d'énumération, et il est également très facile d'ajouter de nouvelles méthodes d'extension.

enum HomeItemType {
  approval, //业务审批
  report, //数据报表
  work, //工作交流
  board, //数据看板
  feedback, //问题反馈
  announce, //公告公示
}

extension HomeItemTypeExtension on HomeItemType {

  String get name => describeEnum(this);

  String get displayTitle {
    switch (this) {
      case HomeItemType.approval:
        return '业务审批';
      case HomeItemType.report:
        return '数据报表';
      case HomeItemType.work:
        return '工作交流';
      case HomeItemType.board:
        return '数据看板';
      case HomeItemType.feedback:
        return '问题反馈';
      case HomeItemType.announce:
        return '公告公示';
      default:
        return 'Title is null';
    }
  }

  String get displayImage {
     switch (this) {
      case HomeItemType.approval:
        return 'assets/images/home_approval.png';
      case HomeItemType.report:
        return 'assets/images/home_report.png';
      case HomeItemType.work:
        return 'assets/images/home_work.png';
      case HomeItemType.board:
        return 'assets/images/home_board.png';
      case HomeItemType.feedback:
        return 'assets/images/home_feedback.png';
      case HomeItemType.announce:
        return 'assets/images/home_announce.png';
      default:
        return 'image is null';
    }
  }

  String describeEnum(Object enumEntry) {
    final String description = enumEntry.toString();
    final int indexOfDot = description.indexOf('.');
    assert(indexOfDot != -1 && indexOfDot < description.length - 1);
    LogUtils().e(description.substring(indexOfDot + 1));
    return description.substring(indexOfDot + 1);
  }
}

Je suppose que tu aimes

Origine blog.csdn.net/RreamigOfGirls/article/details/127241515
conseillé
Classement