我想要一个带有可选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/