Dart常量类参数检查

问题描述 投票:0回答:1

如何对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");
}
dart constructor arguments const
1个回答
1
投票
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.

© www.soinside.com 2019 - 2024. All rights reserved.