Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter Dart编译器是否能够推断常量构造函数的用法?_Flutter_Dart_Constants_Compiler Optimization_Inference - Fatal编程技术网

Flutter Dart编译器是否能够推断常量构造函数的用法?

Flutter Dart编译器是否能够推断常量构造函数的用法?,flutter,dart,constants,compiler-optimization,inference,Flutter,Dart,Constants,Compiler Optimization,Inference,我认为dart将使用const构造函数(如果它能够自动执行),来解释假设我们有一个已经有const构造函数的小部件,比如: 类重试扩展无状态小部件{ 常量重试(); } 然后,因为dart“能够推断常量ussage”,接下来的两个代码将表示并编译成相同的代码: 一, 容器( 子项:重试() ) 容器( 子项:常量重试() ) 这是不是假设dart可以推断他必须对声明了该选项的类使用const构造函数?还是不是? 我如何证实它呢?Dart无法推断出您希望该对象是常量,除非它周围有某种上下文

我认为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在评论中为答案添加了很多上下文,我将把它标记为答案,但是谢谢