Dart中const与final的区别及final变量为何需添加const的疑问
Dart里final和const的区别,以及为何final变量要加const
核心差异点
final:变量仅能被赋值一次,赋值时机可以是运行时(比如从接口拉取数据、调用函数返回值)。赋值完成后变量不能被重新赋值,但如果变量指向的是可变对象(比如普通List),对象内部的内容仍可修改。
示例:final String currentTime = DateTime.now().toString(); // 运行时赋值 final List<int> numbers = [1, 2]; numbers.add(3); // 允许修改对象内容const:变量的值必须是编译时就能确定的常量,不仅变量本身不可被重新赋值,它指向的对象也是深度不可变的(对象内部内容也不能修改)。const变量本质是编译时常量,程序运行时会复用同一个实例,节省内存。
示例:const int maxCount = 100; // 字面量常量 const List<int> fixedNumbers = [1, 2]; fixedNumbers.add(3); // 报错:常量对象不可修改
为什么final变量还要加const?
你遇到的场景里,Color.fromARGB是一个const构造函数(Color类的这个构造方法被const修饰)。
当你写final Color _iconColor = Color.fromARGB(210, 198, 15, 1);时,虽然final保证了_iconColor不会被重新赋值,但每次运行到这行代码,都会创建一个新的Color对象;而加上const后,这个Color对象会在编译阶段就被创建好,整个程序中所有用到这个常量的地方都会复用同一个实例,既节省内存,也符合Dart的性能优化最佳实践,所以VS Code会提示你加上const。
简单说:final管的是「变量不能被重新赋值」,而const管的是「对象本身是编译时常量,可复用」,二者作用层面不同,搭配使用能兼顾变量只读性和对象的常量优化。
内容的提问来源于stack exchange,提问作者benbd5
相关产品推荐
相关产品推荐

