首页 > 解决方案 > Dart 中的 static const 与 final 是否相等?

问题描述

我最近遇到了这个问题。

以下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也很重要吗?

如果可能的话,请向某人解释每种方式的差异,优点和缺点。

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

标签: flutteroopdartoptimization

解决方案


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

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

但是,Widget.==目前使用identical,这意味着如果它们是相同的小部件(即引用相同的实例),则只能使用一个小部件来更新另一个小部件。

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

请注意,这是 Flutter 框架的一个实现细节,它独立于const更普遍使用带来的任何性能优势


推荐阅读