Dart 枚举

Dart 枚举

简单枚举

enum Color { red, green, blue }

增强枚举

增强枚举(Enhanced Enums)是Dart语言在2.15版本中引入的一项新特性。这个特性扩展了枚举(Enum)的能力,使其不仅能表示一组命名常量,而且还能包含方法、属性和构造函数。

额外要求:

  • 实例变量必须是最终变量,包括由混合变量添加的变量。
  • 所有生成构造函数都必须是常量。
  • 工厂构造函数只能返回一个固定的已知枚举实例。
  • 由于 Enum 是自动扩展的,因此不能扩展其他类。
  • 不能重载索引、哈希代码和相等运算符 ==。
  • 不能在枚举中声明名为 values 的成员,因为它会与自动生成的静态值获取器冲突。
  • 必须在声明的开头声明枚举的所有实例,而且必须至少声明一个实例。

在增强枚举中,你可以:

  • 为每个枚举值定义关联的属性和方法。
  • 创建构造函数来初始化这些属性。
  • 使用工厂构造函数来控制枚举实例的创建。
  • 实现接口,并应用混入(Mixins)

示例1:带属性的枚举

要使用增强枚举Season,你可以根据需要访问其属性和枚举值。以下是一些使用方式的例子:

enum Season {
  spring('Spring', 1),
  summer('Summer', 2),
  autumn('Autumn', 3),
  winter('Winter', 4);

  final String name;
  final int order;

  const Season(this.name, this.order);
}

# 使用方式
void main() {
  // 访问枚举值
  var currentSeason = Season.summer;

  // 打印枚举值的属性
  print('Season: ${currentSeason.name}, Order: ${currentSeason.order}');

  // 使用枚举值进行条件判断
  if (currentSeason == Season.winter) {
    print('It\'s cold outside!');
  }

  // 遍历枚举值
  for (var season in Season.values) {
    print('Season Name: ${season.name}');
  }
}

示例2:枚举中的方法

要使用增强枚举Operation,你可以根据需要调用其apply方法来执行数学运算。

enum Operation {
  add,
  subtract,
  multiply,
  divide;

  double apply(double x, double y) {
    switch (this) {
      case Operation.add:
        return x + y;
      case Operation.subtract:
        return x - y;
      case Operation.multiply:
        return x * y;
      case Operation.divide:
        return x / y;
    }
  }
}

# 使用方式
void main() {
  // 使用枚举执行加法
  var resultAdd = Operation.add.apply(10, 5);
  print('Addition: $resultAdd');

  // 使用枚举执行减法
  var resultSubtract = Operation.subtract.apply(10, 5);
  print('Subtraction: $resultSubtract');

  // 使用枚举执行乘法
  var resultMultiply = Operation.multiply.apply(10, 5);
  print('Multiplication: $resultMultiply');

  // 使用枚举执行除法
  var resultDivide = Operation.divide.apply(10, 5);
  print('Division: $resultDivide');
}

示例3:枚举和工厂构造函数

在示例3中,我们定义了一个带有工厂构造函数的StatusCode枚举。这个枚举可以根据状态码创建相应的枚举值。

enum StatusCode {
  success(200),
  notFound(404),
  serverError(500);

  final int code;

  const StatusCode(this.code);

  factory StatusCode.fromCode(int code) {
    return StatusCode.values.firstWhere((e) => e.code == code, orElse: () => StatusCode.serverError);
  }
  
  // 自定义函数
  String statusCodeToString = (String statusCode) => 'Status Code $statusCode: $value';
}

// 以下是如何使用这个枚举的示例:
void main() {
  // 通过状态码创建枚举值
  var code200 = StatusCode.fromCode(200);
  print('Status Code 200: ${code200.toString()}'); // Status Code 200: 200

  var code404 = StatusCode.fromCode(404);
  print('Status Code 404: ${code404.toString()}'); // Status Code 404: 404

  // 使用默认情况(例如,对于未知的状态码)
  var unknownCode = StatusCode.fromCode(999);
  print('Unknown Status Code: ${unknownCode.toString()}'); // Unknown Status Code: 500
}

  // 自定义函数
  var codeToString = StatusCode.statusCodeToString(200) // Status Code 200: 200

Read more

Flutter入门指南

Flutter入门指南

Flutter 是一个由 Google 开发的开源移动应用开发框架。它允许开发者使用一套代码同时构建 iOS 和 Android 应用,并且提供了丰富的 UI 组件和高效的开发工具,使得开发者能够快速构建出高性能的跨平台应用。 一、Flutter 的实现原理 Flutter 的核心在于其自带的高性能渲染引擎 Skia。不同于其他框架依赖于原生的 UI 组件,Flutter 直接通过 Skia 渲染引擎将所有组件绘制到屏幕上。这种方式保证了跨平台应用在 iOS 和 Android 上的表现完全一致。 1.1 结构概览 Flutter 的架构分为三层: 1. Framework(框架层): 这部分主要由 Dart 编写,提供了 Flutter 的各种 UI 组件(Widget)、手势检测、渲染层以及动画等。

By Lewis