Flutter 枚举

557 阅读1分钟

原文链接

Dart语言开中,一般枚举使用方式比较简单,有三种扩展方式

枚举方式1

enum ActivityType {

  running,

  climbing,

  hiking,

  cycling,

  ski

}


extension ActivityTypeNumber on ActivityType {

  int get number {

    switch (this) {

      case ActivityType.running:

        return 1;

      case ActivityType.climbing:

        return 2;

      case ActivityType.hiking:

        return 5;

      case ActivityType.cycling:

        return 7;

      case ActivityType.ski:

        return 10;

    }

  }

}
extension ActivityTypeValue on ActivityType {

  String get value {

    switch (this) {

      case ActivityType.running:

        return 'Running';

      case ActivityType.climbing:

        return 'Climbing';

      case ActivityType.hiking:

        return 'Hiking';

      case ActivityType.cycling:

        return 'Cycling';

      case ActivityType.ski:

        return 'Skiing';

    }

  }

}

访问数字或String值:

final climbingInt = ActivityType.climbing.number; 
final climbingString = ActivityType.climbing.value;

枚举方式2

enum WorkType {
  electrician(name: '电工', grade: 2),
  bricklayer(name: '瓦工', grade: 3),
  carpentry(name: '木工', grade: 1);

  const WorkType({required this.name, required this.grade});
  
  //定义的属性是不可变的,需要使用 `final` 关键字修饰
  final String name;
  final int grade;
}

调用枚举

final String name = WorkType.bricklayer.name;  
final int grade = WorkType.carpentry.grade;

枚举方式3

Flutter 3.0发布后我们不必再依赖这些代码,我们可以使用给枚举赋予一些类的特征,用新的和增强的枚举类重写代码。

enum ActivityType {

  running(1, 'Running'),

  climbing(2, 'Climbing'),

  hiking(5, 'Hiking'),

  cycling(7, 'Cycling'),

  ski(10, 'Skiing'),

  unknown(-1, '');

  const ActivityType(this.number, this.value);

  final int number;

  final String value;
  
  
  //静态方法
  static ActivityType getTypeByTitle(String title) => ActivityType.values.firstWhere((activity) => activity.name == title,orElse: () => ActivityType.unknown); 
  
  static ActivityType getType(int number) => ActivityType.values.firstWhere((activity) => activity.number == number,orElse: () => ActivityType.unknown);
  
  static String getValue(int number) => ActivityType.values.firstWhere((activity) => activity.number == number,orElse: () => ActivityType.unknown).value;
  
  
  String activityString(String userName) => '$userName is $value';

}

调用枚举


final userIsWorkingOut = ActivityType.climbing.activityString('Emily Jules'); 

print('$userIsWorkingOut');


//输出
Emily Jules is Climbing

枚举比较

Enum.compareByIndex(value1, value2)

述代码总结:

  • 如果 Enum.compareByIndex 的结果小于零,则 value1的枚举成员排序靠前; value2枚举成员排序靠后。

  • 如果 Enum.compareByIndex 的结果等于零,则 value1value2枚举成员是同一个。

  • 如果 Enum.compareByIndex 的结果大于零,则 value1的枚举成员排序靠后; value2枚举成员排序靠前。