dart - Dart const类参数检查

标签 dart constructor arguments constants

如何对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/

相关文章:

c++ - 代码重构尝试使用多态性和 std::map

constructor - VB 中构造函数的正确语法?

java - 提供参数时构造函数显示 'found no arguments'

php 解释器和 superglobals

flutter - 如何全局更改 OutlineButton 的边框颜色和宽度?

dart - 如何在 Dart 中创建 CSS 关键帧规则

flutter - 文本表单字段内的内联平面按钮

c++ - 具有参数化构造函数的二维 vector

arrays - 以向量下标作为过程参数的数组部分

dart - 无法安装flutter_plugins_tools,依赖错误