如何对const类进行参数检查?
比如说
class Data {
String value;
const Data(this.value);
}
如何检查例如 value.contains("banana") == true
?
如果我试着像下面这样在 assert 中检查,linter 报告了错误 Invalid constant value. dart(invalid_constant)
class Data {
String value;
const Data(this.value)
: assert(value.contains("banana");
}
class Data {
String value;
const Data(this.value)
: assert(value.contains("banana");
}
首先,你的断言后面少了一个括号。另外,在一个常量类中,所有的字段都必须标记为final。
但最后一件事(这才是与你的问题相关的)是,如果你的构造函数被标记为 const
,那么你的断言中的所有值和操作都必须是常量。这是因为常量实例是在编译时初始化的,编译器不能执行断言,因为它必须运行代码以验证构造函数数据。
这意味着你可以对其他常量值执行诸如平等或其他布尔运算符检查。
: assert(value == 'banana');
但你不能与非常量值进行比较,也不能调用方法(注意:显示的错误不是编译器实际报告的错误)。
: assert(value == Foo()); // Error: Foo is not a constant
: assert(value.contains('banana')); // Error: method calls are not a constant operation
: assert(value == const Bar()); // Error: Bar is not a compiler-known constant
最后一个错误可能有点令人费解,因为... Bar
是一个常量类对象。但它不能工作的原因是,为了实现 ==
(布尔运算符等于)。Bar
必须为该操作符定义代码,而编译器不能在常量断言中运行代码。最终的结果是,即使一个对象被标记为常量,它仍然不能在断言中使用。你只能使用基元常量,即. Null, bool, int, double, String
.