【问题标题】:How to define fields in a built_value EnumClass?如何在built_value EnumClass 中定义字段?
【发布时间】:2019-03-12 18:10:40
【问题描述】:

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

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);
}

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

无法为具有非最终字段的类定义 const 构造函数。

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

有没有办法做到这一点?也许制作一个生成的 Enum Builder?

【问题讨论】:

    标签: dart code-generation built-value


    【解决方案1】:

    “枚举类型”的目的是创建一组预定义的值。如果您允许客户端创建新的 Status 实例,甚至是 const 实例,那么该属性将不再存在;如果传递这样一个实例,valueOf() 方法会抛出异常,而values 不会包含它。所以这违反了“枚举类型”的约定。

      // 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."
      };
    

    【讨论】:

    • 好吧,所以 built_value EnumClass 不像许多人所说的那样是 Java 枚举。
    • Java 也不允许您创建新实例;只是为了在定义时将常量信息与现有实例相关联。确实,built_value 中似乎没有精确的等价物;最接近的等价物是定义一个索引到私有映射的getter,就像我的第二个例子一样。
    • 如果我没记错的话,在 Java 中我们可以在创建枚举时传递变量并取回它们的值,但我已经有一段时间了,我现在有点懒无论如何在文档上搜索哈哈哈,我最后所做的是创建一个常规 Dart enum 并将其传递给 bulit_value 值类型类,该类包含一个 enum 和一个可选的 message
    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 2020-04-01
    • 2018-10-16
    • 1970-01-01
    • 2023-02-24
    • 2017-07-26
    相关资源
    最近更新 更多