如何对const类执行参数检查?
例如:
class Data {
String value;
const Data(this.value);
}
我如何检查例如
value.contains("banana") == true
?如果我尝试按如下所示的断言检查它,则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
,则断言中的所有值和操作都必须为常量。这是因为常量实例在编译时进行了初始化,并且编译器无法在必须运行代码才能验证构造函数数据的位置执行断言。这意味着您可以针对其他常量值执行诸如相等性或其他 bool(boolean) 运算符检查之类的操作:
: 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
是一个常量类对象,所以最后一个错误可能会有点钝。但是,之所以不起作用,是因为为了实现==
( bool(boolean) 等于运算符),Bar
必须为该运算符定义代码,并且编译器无法在常量断言中运行代码。最终结果是,即使将对象标记为常量,也仍然不能在断言中使用该对象。您只能使用基本常量,即Null, bool, int, double, String
。
关于dart - Dart const类参数检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61701852/