【问题标题】:Is static const vs final both equal in Dart?Dart 中的 static const 与 final 是否相等?
【发布时间】:2021-09-22 12:35:57
【问题描述】:

我最近遇到了这个问题。

以下Dart 语句是否相等或有什么区别:

class StaticConstVsFinal {
    static const timeout1 = const Duration(seconds: 5);  // ------> 1

    static const timeout2 = Duration(seconds: 5);        // ------> 2

    final timeout3 = const Duration(seconds: 5);         // ------> 3

    final timeout4 = Duration(seconds: 5);               // ------> 4
}

根据我的理解,static const 变量不会分配内存,无论创建多少 StaticConstVsFinal 实例,内存使用量都不会增加,因为这些是类变量,但对于 final 变量,它会增加内存使用量. ---> 如果我错了,请纠正我。

将这些Flutter Widgets 定义为常量有什么优缺点,这也是必要的吗?

如果可能,请向某人解释每种方式的区别、优缺点。

我知道有一个非常相似的Question here,但它并没有涵盖上述所有场景。所以,请不要将这些标记为重复。

【问题讨论】:

标签: flutter oop dart optimization


【解决方案1】:

这两个是等价的。

static const timeout1 = const Duration(seconds: 5);  // ------> 1
static const timeout2 = Duration(seconds: 5); // ------> 2    

这些是等价的:

final timeout3 = const Duration(seconds: 5);         // ------> 3
const timeout3 =  Duration(seconds: 5);         // ------> 3a
var timeout3 = const Duration(seconds: 5);         // ------> 3b

当您使用static 时,您正在执行延迟初始化,这意味着除非使用该变量,否则它不会被初始化。前两个代码 sn-ps(timeout1timeout2)就是这样做的。

这个很奇怪,因为它不是const

final timeout4 = Duration(seconds: 5);               // ------> 4

【讨论】:

  • 感谢您的解释,特别是分离出第四个,并显示第三个的替代品。如果我们要对 Flutter Widgets 做同样的事情,是否有任何 Flutter 特定的解释?
  • 尝试尽可能多地使用const(以获得更好的性能),因为使用const可确保无论您实例化多少次都不会创建底层小部件的新实例对象。
  • 是的,真实的故事!再次感谢。
【解决方案2】:

@CopsOnRoad 的回答很好,但特别是关于 Flutter,const 小部件有一个特别的好处:

当 Flutter 重建您的小部件树时,它会将旧的小部件树与新的小部件树进行比较,以查看哪些部分需要重建。如果遇到oldWidget == newWidget 的位置,它只会在该位置重用旧小部件的现有元素(即它不会重建)。

但是,Widget.== 当前使用 identical,这意味着只有当它们是相同的小部件(即引用同一个实例)时,一个小部件才能用于更新另一个小部件。

const 免费为您提供。小部件树中const 的任何部分都保证在每次重建中都是相同的,因为只有一个实例。这实际上意味着const 小部件“阻止”了重建的传播。

请注意,这是 Flutter 框架的一个实现细节,与更普遍地使用 const 所带来的任何性能优势无关

【讨论】:

  • 没错!根据我的理解,我也同意你的解释!谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 2012-06-28
  • 2014-05-12
  • 2010-11-13
  • 2013-10-28
  • 1970-01-01
  • 2015-05-11
相关资源
最近更新 更多