cons 的声明必须使用const,你必须将它声明为static const 而不仅仅是const。
static、final 和 const 在 Dart 中表示完全不同的东西:
static 表示成员在类本身而不是类的实例上可用。这就是它的全部含义,它不用于其他任何事情。 static 修改成员。
final 表示单一赋值:最终变量或字段必须有一个初始化器。一旦分配了一个值,最终变量的值就不能更改。 final 修改变量。
const 在 Dart 中具有更复杂和微妙的含义。 const 修改值。您可以在创建集合时使用它,例如 const [1, 2, 3],以及在构造对象(而不是 new)时,例如 const Point(2, 3)。这里,const 意味着对象的整个深度状态可以完全在编译时确定,并且对象将被冻结并且完全不可变。
Const 对象有几个有趣的属性和限制:
它们必须由可在编译时计算的数据创建。 const 对象无权访问您在运行时需要计算的任何内容。 1 + 2 是有效的 const 表达式,但 new DateTime.now() 不是。
它们是深刻的、传递性的不可变的。如果您有一个包含集合的最终字段,则该集合仍然可以是可变的。如果您有一个 const 集合,则其中的所有内容也必须是 const 递归的。
它们是规范化的。这有点像字符串实习:对于任何给定的 const 值,无论对 const 表达式求值多少次,都将创建并重复使用单个 const 对象。换句话说:
getConst() => const [1, 2];
main() {
var a = getConst();
var b = getConst();
print(a === b); // true
}
我认为 Dart 在保持语义和关键字清晰明确方面做得很好。 (曾经有一段时间 const 用于 const 和 final。这很令人困惑。)唯一的缺点是,当你想指示一个成员是单赋值的并且在类本身上时,你必须同时使用这两个关键字:静态最终。
还有:
我建议你看看这个问题
What is the difference between the "const" and "final" keywords in Dart?