【发布时间】:2019-03-28 21:53:51
【问题描述】:
padding: const EdgeInsets.all(25.0)
padding: EdgeInsets.all(25.0),
Dart demo中,大部分padding或者child加const,有什么优化吗?
【问题讨论】:
padding: const EdgeInsets.all(25.0)
padding: EdgeInsets.all(25.0),
Dart demo中,大部分padding或者child加const,有什么优化吗?
【问题讨论】:
假设我们有这三行代码:
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,我们可以减少每次重新创建和使用相同对象的时间,相反,我们创建一个对象,然后在每次需要时重用它。
【讨论】:
“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 对象。换句话说:
【讨论】:
const表示对象(此处为填充)的整个深度状态可以完全在编译时确定,并且填充将被冻结并且完全不可变。
PS:请阅读评论以获得更好的解释
【讨论】:
const 不会使对象不可变。使用new EdgeInsets.all(25.0)(有或没有文字new)创建的对象同样是不可变的。取而代之的是const确保对象是不可变的(你不能犯错误并意外创建一个可变对象),并且它规范化对象,所以所有的表达const EdgeInsets.all(25.0) 的形式评估为完全相同的对象。如果您在许多地方使用相同的值,则可以节省一些内存,而无需创建全局变量来共享对象。