dart - 如何在内置值枚举类中定义字段?

标签 dart code-generation built-value

我想要一个带有可选EnumClass字段的message,如下所示:

class Status extends EnumClass {
  static const Status error = _$error;
  static const Status completed = _$completed;

  String message;

  const Status._(String name) : super(name);

  static BuiltSet<Status> get values => _$values;
  static Status valueOf(String name) => _$valueOf(name);
}


问题是我收到此错误消息:

Can't define a const constructor for a class with non-final fields.



而且,如果我将message声明为final,那么我将无法初始化它,因为构造函数是隐藏的。

有没有办法做到这一点?也许使生成的枚举生成器?

最佳答案

“枚举类型”的目的是创建一组预定义的值。如果允许客户端创建Status的新实例,甚至是const实例,则该属性将不再保留;如果传递了此类实例,则valueOf()方法将引发异常,而values将不包含该异常。因此,这违反了“枚举类型”的契约(Contract)。

  // BAD: no longer an "enum type" if clients can create new instances
  const Status.withMessage(String name, String message)
    : message = message, super(name);

另一方面,如果消息对于每个枚举值而言是恒定的,并且不打算由客户端提供,则可以简单地将getter添加到类中:

  // GOOD: Adding new methods, getters, or const-initialized member variables is fine.
  String get message =>
      _messages[this] ??
          (throw StateError('No message for Status.$name'));

  static const _messages = const {
    error: "An error occurred.",
    completed: "Successfully completed."
  };

关于dart - 如何在内置值枚举类中定义字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128138/

相关文章:

swift - 传入runtimeType作为通用函数参数

android-studio - Flutter Bloc 中 mapEventToState 的当前状态不是 yield

dart - 如何在Redstone中将HTTP请求重定向到https?

dart - build_value可以反序列化这样的泛型吗?

flutter - 我想知道用户是否已经对我的应用进行了评价?

java - 单独的接口(interface)和实现 emf ecore

code-generation - 从 DomainModelTemplate 解析类型时出现问题

kotlin - 使用 KotlinPoet 或类似软件;生成非原始 Kotlin 字符串文字

flutter - 使用 map 而不是 for 语句使类模型中的列表返回零