如何从构造函数初始化列表中的常量构造函数访问属性?

问题描述

我无法理解 dart 中的常量构造函数和构造函数初始值设定项列表。

我有这个小代码

...
<button class="btn btn-warning btn-xs"
            type="submit" id="submit">
...
let submit = e.target.getElementById('submit');
...

所有这些类及其构造函数都是合法的。除了 class A { const A(); } class B { const B(); final A a = const A(); } class C { const C(): a = const A(); final A a; } class D { const D(): b = const B(); final B b; } class E { const E(): a = const B().a; // <- Lint: Invalid constant value final A a; } E 构造函数


我不明白的是 E() 构造函数是有效的:

D

但是 const C(): a = const A(); 无效:

E

这让我有点困惑,为什么 const E(): a = const B().a; // <- Lint: Invalid constant value 可以是一个常量值而 B() 不是?我会想如果一个对象是一个常量构造函数B().a 也会是一个常量值。

在这里遗漏了什么?

解决方法

这让我有点困惑,为什么 B() 可以是一个常量值而不是 B().a 不是?我会想如果一个对象是一个常量构造函数,B().a 也会是一个常量值。

Dart 没有 C++ 中的 constexpr 等价物。 Dart 无法传达方法/函数可以作为编译时常量表达式进行计算和调用。

B().aa 上调用名为 B() 的 getter。仅仅因为 const B() 是一个 const 对象并不意味着 const B().a 返回一个常量值。例如,B 的实现可以是:

class B {
  const B();

  // Returns a new `A` instance each time.
  A get a => A();
}