Flutter Dart编译器是否能够推断常量构造函数的用法?
我认为dart将使用Flutter Dart编译器是否能够推断常量构造函数的用法?,flutter,dart,constants,compiler-optimization,inference,Flutter,Dart,Constants,Compiler Optimization,Inference,我认为dart将使用const构造函数(如果它能够自动执行),来解释假设我们有一个已经有const构造函数的小部件,比如: 类重试扩展无状态小部件{ 常量重试(); } 然后,因为dart“能够推断常量ussage”,接下来的两个代码将表示并编译成相同的代码: 一, 容器( 子项:重试() ) 容器( 子项:常量重试() ) 这是不是假设dart可以推断他必须对声明了该选项的类使用const构造函数?还是不是? 我如何证实它呢?Dart无法推断出您希望该对象是常量,除非它周围有某种上下文
const
构造函数(如果它能够自动执行),来解释假设我们有一个已经有const构造函数的小部件,比如:
类重试扩展无状态小部件{
常量重试();
}
然后,因为dart“能够推断常量ussage”,接下来的两个代码将表示并编译成相同的代码:
一,
容器(
子项:重试()
)
容器(
子项:常量重试()
)
这是不是假设dart可以推断他必须对声明了该选项的类使用const
构造函数?还是不是?
我如何证实它呢?Dart无法推断出您希望该对象是常量
,除非它周围有某种上下文迫使它成为常量。在您展示的示例中,情况并非如此。如果您想让dart制作一些const
,您必须在某个时候使用const
关键字
推断的常数的示例:
const SizedBox(
child: Retry(),
)
大小框上的常量
强制重试
为常量
。这和类似的情况是唯一隐含const
的地方。不,Dart编译器不会推断const
,除非语法上下文需要constness,例如,如果您编写const[A()]
将A()
放入const上下文,这意味着const[A()]
与const相同[const A()]
,几乎没有其他地方适用同样的情况(例如元数据@A()
)
通常情况下,Dart编译器无法在语言规范要求的地方之外推断出const
,因为它可能会改变程序的语义。请考虑:
A类{
常数A();
}
最终集s={};
空富(A){
s、 添加(a);
}
void main(){
foo(A());
foo(A());
印刷品(s.长度);
}
如果编译器只是在构造函数调用上放置const
,那么这个程序将打印1
,但是它应该打印2
,SizedBox
的原因是什么?如果您看到容器没有const构造函数
,但是Retry
没有it@DanielGomezRico为了使SizedBox是常量,它的所有属性也必须是常量,因此它将使用Retry的常量构造函数。我希望Retry
被威胁为常量
,但不是容器
,我知道它没有常量
构造函数,我不确定问题是否不清楚enought@DanielGomezRico如果你想Retry
成为const
你必须在某个地方使用const
关键字。因此,在你的情况下,你必须执行const Retry
。这是无法回避的。我想你可以启用一些linter规则/警告来告诉你可以在哪里添加const。谢谢你,我想知道如果有什么方法可以确定的话,也许可以检查中间编译文件?我来自android,在那里我们可以看到编译后的文件并确定编译后生成的内容。编译器原则上可以,但不会,因为自动使用const
可能会导致行为的改变。另请参见。谢谢或者答案,但是由于christoper在评论中为答案添加了很多上下文,我将把它标记为答案,但是谢谢