【问题标题】:In Dart, what's the difference between 'const' parameter?在 Dart 中,'const' 参数有什么区别?
【发布时间】:2019-03-28 21:53:51
【问题描述】:
padding: const EdgeInsets.all(25.0)
padding: EdgeInsets.all(25.0),

Dart demo中,大部分padding或者child加const,有什么优化吗?

https://docs.flutter.io/flutter/widgets/Padding-class.html

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    假设我们有这三行代码:

    1.const EdgeInsets.all(25.0)
    2.const EdgeInsets.all(25.0)
    3.const EdgeInsets.all(25.0)
    

    1。在第一行,EdgeInsets 类创建一个新对象,并为其分配左、上、右、下值并渲染给定的小部件,然后如果在另一个地方找到它,它会创建一个具有相同值的常量对象进行渲染。

    2。 嘿,已经有一个具有此值的对象,所以只需渲染它。

    3。 嘿,已经有一个具有此值的对象,所以只需渲染它。

    现在,让我们考虑一下这些场景:

    1.EdgeInsets.all(25.0)
    2.EdgeInsets.all(25.0)
    3.EdgeInsets.all(25.0)
    

    1。 在第一行,EdgeInsets 类创建了一个新对象,并为其分配左、上、右、下值并渲染给定的小部件。

    2。 在第二行,EdgeInsets 类创建了一个新对象,并为其分配左、上、右、下值并渲染给定的小部件。

    3。 在第三行,EdgeInsets 类创建了一个新对象,并为其分配左、上、右、下值并渲染给定的小部件。

    因此,通过使用 const,我们可以减少每次重新创建和使用相同对象的时间,相反,我们创建一个对象,然后在每次需要时重用它。

    【讨论】:

      【解决方案2】:

      “const”在 Dart 中具有更复杂和微妙的含义。 const 修改。您可以在创建集合时使用它,例如 const [1, 2, 3],以及在构造对象(而不是 new)时,例如 const Point(2, 3)。这里,const 意味着对象的整个深度状态可以完全在编译时确定,并且对象将被冻结并且完全不可变。

      Const 对象有几个有趣的属性和限制: 它们必须由可在编译时计算的数据创建。 const 对象无权访问您在运行时需要计算的任何内容。 1 + 2 是有效的 const 表达式,但 new DateTime.now() 不是。 它们是深刻的、传递性的不可变的。如果您有一个包含集合的最终字段,则该集合仍然可以是可变的。如果您有一个 const 集合,则其中的所有内容也必须是 const 递归的。 它们是规范化的。这有点像字符串实习:对于任何给定的 const 值,无论对 const 表达式求值多少次,都将创建并重复使用单个 const 对象。换句话说:

      Src here

      【讨论】:

        【解决方案3】:

        const 表示对象(此处为填充)的整个深度状态可以完全在编译时确定,并且填充将被冻结并且完全不可变。

        PS:请阅读评论以获得更好的解释

        【讨论】:

        • const 不会使对象不可变。使用new EdgeInsets.all(25.0)(有或没有文字new)创建的对象同样是不可变的。取而代之的是const确保对象是不可变的(你不能犯错误并意外创建一个可变对象),并且它规范化对象,所以所有的表达const EdgeInsets.all(25.0) 的形式评估为完全相同的对象。如果您在许多地方使用相同的值,则可以节省一些内存,而无需创建全局变量来共享对象。
        猜你喜欢
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-26
        • 2013-07-12
        • 2010-10-27
        相关资源
        最近更新 更多