我正在使用下面的样式类来模仿枚举(来自Does Dart support enumerations?)
这段代码可以产生预期的结果,因此效果很好。
void main() {
InterpolationType it = InterpolationType.LINEAR;
print("it is $it and stringified ${stringify(it)}");
print(InterpolationType.fromJson(it.toJson()));
}
但是DartEditor在fromJson方法的case语句中抱怨“期望常量表达式”。我可以在某个地方扔掉const以摆脱这种抱怨吗?
class InterpolationType {
static const LINEAR = const InterpolationType._(0);
static const STEP = const InterpolationType._(1);
static const CUBIC = const InterpolationType._(2);
static get values => [
LINEAR,
STEP,
CUBIC
];
final int value;
const InterpolationType._(this.value);
String toString() {
switch(this) {
case LINEAR: return "LINEAR";
case STEP: return "STEP";
case CUBIC: return "CUBIC";
}
}
int toJson() {
return this.value;
}
static InterpolationType fromJson(int v) {
switch(v) {
case LINEAR.value: return LINEAR;
case STEP.value: return STEP;
case CUBIC.value: return CUBIC;
}
}
static InterpolationType fromString(String s) {
switch(s) {
case "LINEAR": return LINEAR;
case "STEP": return STEP;
case "CUBIC": return CUBIC;
}
}
}
最佳答案
如您所发现:从const对象访问字段不是恒定的操作。因此,编辑器(以及VM和dart2js)是正确的。
使用当前语法,无法表示类的字段将始终是最终字段的(非正式)约定。例如,我可以将value字段更改为getter而不是字段。该类的接口(interface)契约绝对允许我这样做,因为我从未告诉任何人我会保留“值”作为字段。但是,如果我这样做,它将破坏依赖于此最终字段存在的每个程序。
结果,当前行为很难改变。
但是:从理论上讲,可以改进Dart语言,以便可以对本地字段使用“const”而不是“final”,并使用初始化列表进行初始化。在这种情况下,访问该字段可被视为恒定操作。我目前没有看到这种行为的任何缺点,并且它是向后兼容的。
// WARNING: What follows DOES NOT WORK, just a potential example
class InterpolationType {
const value; // Note the "const" instead of "final".
const InterpolationType._(this.value);
}
该语言已经相当稳定,但是您可以在http://dartbug.com/中打开一个错误并提出此行为。接受功能请求的可能性很小,但是绝对值得一试。