以下内容:
import 'package:flutter/foundation.dart';
class Bar {
final int tender;
const Bar(this.tender);
}
class Foo {
final int foo;
final Bar bar;
const Foo({@required foo})
: foo = foo,
bar = const Bar(foo);
}
尝试初始化 bar = const Bar(foo)
会导致编译器错误“常量创建的参数必须是常量表达式”。为什么该行会失败,而前面的行 foo = foo
不会失败?
编辑只是为了进一步澄清困惑的根源:实际上,就好像可以用参数 foo
来 const 构造一个 Foo
一样> (在编译时未知),但是用完全相同的参数 const 构造一个 Bar
是不行的。为什么?
最佳答案
该行失败,因为正在传递变量
而不是常量/文字
来创建Bar<的
。编译器不知道 const
对象foo
在编译时会是什么,因此无法创建 const Bar(foo)
考虑一下:
void main(){
int someNonConstantValue = 10;
const Bar(someNonConstantValue);
}
编译器在这里发出警告,并显示相同的错误消息
Arguments of a constant creation must be constant expressions
这是因为 someNonConstantValue
不是常量。
现在如果代码修改为:
void main(){
const int someConstantValue = 10;
const Bar(someConstantValue);
}
没有警告,因为编译器现在确信 someConstantValue
实际上是常量,并且不会随时更改(因此它可以编译和优化代码)。
类似地,在原始示例中,如果进行更改以使用常量文字
来创建const Bar(
class Bar {
final int tender;
const Bar(this.tender);
}
class Foo {
final int foo;
final Bar bar;
const Foo({@required this.foo})
: bar = const Bar(10);
}
添加:
按照与上面相同的解释,如果 const Foo(
传递了 variable
void main(){
int someNonConstantValue = 10;
const Foo(foo:someNonConstantValue);
}
您所指的点是其自己的类中的构造函数声明
。尚未以任何值调用它。
编辑:
This github issue是对 Dart 早期类似路线的讨论。
This answer提供了相同的解释。
关于dart - Dart 中 const 构造函数初始化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62692542/