You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中如何实现枚举扩展以避免错误类型代码重复?

在Dart中避免错误枚举重复的解决方案

Dart的枚举不支持继承,所以没法直接实现你想要的extends写法,不过可以通过以下几种方式解决代码重复问题:

方案一:用类+常量替代枚举(兼容所有Dart版本)

把基础错误定义成包含常量的类,让扩展错误类继承它,同时复用基础错误的常量:

// 基础错误类
class WifiBaseErrors {
  final String name;

  const WifiBaseErrors(this.name);

  static const wifiNotFound = WifiBaseErrors('wifiNotFound');
  static const permissionMissing = WifiBaseErrors('permissionMissing');
  static const wifiTurnedOff = WifiBaseErrors('wifiTurnedOff');
}

// 扩展的PIN连接错误类
class WifiPinCodeConnectionErrors extends WifiBaseErrors {
  const WifiPinCodeConnectionErrors(super.name);

  // 新增的错误类型
  static const wrongPin = WifiPinCodeConnectionErrors('wrongPin');
  static const pinTooShort = WifiPinCodeConnectionErrors('pinTooShort');

  // 复用基础错误常量,方便直接通过该类访问
  static const WifiBaseErrors wifiNotFound = WifiBaseErrors.wifiNotFound;
  static const WifiBaseErrors permissionMissing = WifiBaseErrors.permissionMissing;
  static const WifiBaseErrors wifiTurnedOff = WifiBaseErrors.wifiTurnedOff;
}

用法和枚举一致,直接通过WifiPinCodeConnectionErrors.wifiNotFound这类方式调用,同时实现了代码复用。

方案二:使用联合类型(Dart 3.0+)

如果你的项目使用Dart 3.0及以上版本,可以利用联合类型将基础枚举和新增错误枚举合并:

enum WifiBaseErrors {
  wifiNotFound,
  permissionMissing,
  wifiTurnedOff
}

// 定义新增的错误枚举
enum WifiPinCodeExtraErrors {
  wrongPin,
  pinTooShort
}

// 联合类型,涵盖基础错误和新增错误
typedef WifiPinCodeConnectionErrors = WifiBaseErrors | WifiPinCodeExtraErrors;

// 函数返回联合类型
WifiPinCodeConnectionErrors connectToDeviceUsingPin() {
  // 根据业务逻辑返回任意一种错误
  return WifiBaseErrors.wifiNotFound;
  // 或者 return WifiPinCodeExtraErrors.wrongPin;
}

这种方式完全不需要重复定义枚举值,类型安全且代码最简洁,是Dart3+的最优解。

方案三:枚举+扩展方法(适合必须用枚举的场景)

如果业务要求必须使用枚举,可以通过扩展方法减少转换代码,虽然还是要重复定义枚举值,但能避免后续逻辑里的重复:

enum WifiBaseErrors {
  wifiNotFound,
  permissionMissing,
  wifiTurnedOff
}

enum WifiPinCodeConnectionErrors {
  wifiNotFound,
  permissionMissing,
  wifiTurnedOff,
  wrongPin,
  pinTooShort
}

// 扩展方法:将基础错误转换为PIN连接错误
extension WifiBaseErrorsToPinError on WifiBaseErrors {
  WifiPinCodeConnectionErrors toPinConnectionError() {
    switch (this) {
      case WifiBaseErrors.wifiNotFound:
        return WifiPinCodeConnectionErrors.wifiNotFound;
      case WifiBaseErrors.permissionMissing:
        return WifiPinCodeConnectionErrors.permissionMissing;
      case WifiBaseErrors.wifiTurnedOff:
        return WifiPinCodeConnectionErrors.wifiTurnedOff;
    }
  }
}

当需要把WifiBaseErrors类型的错误转换成WifiPinCodeConnectionErrors时,直接调用.toPinConnectionError()即可。

内容的提问来源于stack exchange,提问作者Ensei Tankado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:18:17