Как определить поля во встроенном_значении EnumClass? - PullRequest
0 голосов
/ 12 марта 2019

Я хотел бы иметь 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);
}

Проблема в том, что я получаю это сообщение об ошибке:

Невозможно определить конструктор const для класса с неокончательными полями.

И если я объявлю message как final, я не смогу его инициализировать, поскольку конструктор скрыт.

Есть ли способ достичь этого? Может быть, создать сгенерированный Enum Builder?

1 Ответ

1 голос
/ 13 марта 2019

Цель «enum type» - создать предопределенный набор значений. Если вы позволите клиентам создавать новые экземпляры Status, даже постоянные, это свойство больше не будет храниться; метод valueOf() выдает исключение, если передается такой экземпляр, а values не содержит его. Таким образом, это нарушает контракт типа enum.

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

С другой стороны, если сообщение является постоянным для каждого значения перечисления и не предназначено для предоставления клиентами, вы можете просто добавить геттер в класс:

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