如何在Dart中为枚举成员设置关联常量值?

4

我能找到的唯一设置枚举值的方法是这个: 在Dart中向枚举添加方法或值

但是,我觉得这有点繁琐。 有更好的方法吗?

C# 中,我只需简单地执行以下操作:

enum ErrorCode
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}
4个回答

4

下面是一个简单的示例

enum ErrorCode {
  None,
  Unknown,
  ConnectionLost,
  OutlierReading,
}

extension ErrorCodeExtention on ErrorCode {
  static final values = {
    ErrorCode.None: 0,
    ErrorCode.Unknown: 1,
    ErrorCode.ConnectionLost: 100,
    ErrorCode.OutlierReading: 200,
  };

  int? get value => values[this];
}

稍微短了一点,谢谢,但我认为这种方式仍然有点繁琐。 - Visual Sharp

0
自从Dart 2.17版本以后,你可以像这样声明带有成员的枚举:
enum ErrorCode {
  None(0),
  Unknown(1),
  ConnectionLost(100),
  OutlierReading(200);

  const ErrorCode(this.code);

  final int code;
}

print(ErrorCode.None.code);
print(ErrorCode.Unknown.code);
print(ErrorCode.ConnectionLost.code);
print(ErrorCode.OutlierReading.code);

0
在Dart中有一个即将推出的功能叫做增强枚举,它允许使用类似于类的特性来声明枚举。例如:
enum ErrorCode {
    None(0),
    Unknown(1),
    ConnectionLost(100),
    OutlierReading(200);
  final int value;
  const ErrorCode(this.value);
}

该功能尚未发布(请注意,有几个问题尚未解决),但可以通过传递--enable-experiment=enhanced-enums来使用适当新鲜的工具版本进行实验。

结果是ErrorCode是一个枚举声明,有四个值ErrorCode.NoneErrorCode.Unknown等等,我们有ErrorCode.None.value == 0ErrorCode.Unknown.value == 1等等。目前的最新版本在常见的前端处理此示例(因此dartdart2js将处理它),但分析器尚未处理。


很遗憾,目前无法将属性视为常量值处理。 - Sergio G
1
Sergio,我想你指的是枚举类型的属性不是一个常量表达式,例如:enum ErrorCode { none(0), unknown(1), connectionLost(100), outlierReading(200); final int value; const ErrorCode(this.value); } const c1 = ErrorCode.none; const c2 = ErrorCode.none.value; // 错误,不是一个常量值。请查看https://github.com/dart-lang/language/issues/2780以获取有关此主题的进一步讨论。 - Erik Ernst
非常感谢您发送有关这个特定问题的参考资料。 - Sergio G

0
尝试使用私有命名的常量构造函数,使用下划线代替名称。它的行为类似于枚举,因为无法从类外部实例化。
class ErrorCode {
  final int code;
  const ErrorCode._(this.code);

  static const ErrorCode None = ErrorCode._(0);
  static const ErrorCode Unknown = ErrorCode._(1);
  static const ErrorCode ConnectionLost = ErrorCode._(100);
  static const ErrorCode OutlierReading = ErrorCode._(200);
}

然后你可以像这样使用它:
var a = ErrorCode.ConnectionLost;
print(a.code);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接