flutter - 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
也很重要吗?
如果可能的话,请向某人解释每种方式的差异,优点和缺点。
我知道这里有一个非常相似的问题,但它并没有涵盖上述所有场景。所以,请不要将这些标记为重复。
解决方案
@CopsOnRoad 的回答很好,但特别是关于 Flutter,const
小部件有一个特别的好处:
当 Flutter 重建你的小部件树时,它会将旧的小部件树与新的小部件树进行比较,以查看哪些部分需要重建。如果它遇到一个点 where oldWidget == newWidget
,它只是在那个点重用旧小部件的现有元素(即它不重建)。
但是,Widget.==
目前使用identical
,这意味着如果它们是相同的小部件(即引用相同的实例),则只能使用一个小部件来更新另一个小部件。
const
免费给你这个。小部件树的任何部分const
都保证在每次重建中都是相同的,因为只有一个实例。这实际上意味着const
小部件“阻止”了重建的传播。
请注意,这是 Flutter 框架的一个实现细节,它独立于const
更普遍使用带来的任何性能优势
推荐阅读
- c# - 如何使用 mongodb c# 驱动程序更新除 ID 之外的整个文档
- c# - ASP.NET Core MVC Web App 不会在 Id 之前附加斜杠
- reactjs - 为什么 componentDidUpdate() 没有检测到我的组件的状态变化?
- android - 为什么 requestLocationUpdates 会在接收时立即触发?
- eclipse - “SonarLint 更新”对话框被切断
- java - 多线程 PDF 操作
- swift - 展开我之前设置的纹理值时发现 nil
- python - 如何在python中同时读写一个文本文件?
- android - 点击带有firebase的推送通知中的操作并做出本机反应
- java - 使用从 Java 到 Kotlin 的反射的重构方法