
在前面的学习中,我们已经用过很多变量:
String name ='Tom';
int age =18;你可能也已经见过这样的写法:
final String name = 'Tom';
const String city = 'Beijing';甚至在 Flutter 中,经常看到:
const Text('Hello Flutter')那么问题来了:
·final 和 const 有什么区别?
·什么叫“编译时确定”和“运行时确定”?
·为什么 Flutter 强烈推荐使用 const?
这一篇,我们把这些一次性讲清楚。
一、为什么需要 final 和 const?
先看一个普通变量:
String name = 'Tom';
name = 'Jack';这是允许的,因为普通变量是 可变的。
但在很多场景中:
·数据一旦确定,就不应该再被修改
·修改反而可能引入 Bug
这时,就需要 不可变变量。

二、final:运行时确定,只能赋值一次
final String name = 'Tom';特点:
·只能赋值一次
·赋值后不可再修改
final int age = 18;
// age = 20; ❌ 报错2️⃣ 什么是“运行时确定”?
看一个例子:
final time = DateTime.now();这里的 time:
·在写代码时不知道具体值
·只有程序运行时才能确定
📌 这种情况:
只能用 final,不能用 const
三、const:编译时就必须确定的常量
const String name = 'Tom';
const int age = 18;特点:
·值在 编译阶段就必须确定
·完全不可变
2️⃣ 什么是“编译时确定”?
意思是:
在写代码的时候,值就已经是一个确定的常量
例如:
const String city = 'Beijing';
const int maxCount = 10;这些值:
·不依赖运行环境
·不依赖计算结果
·不依赖函数调用

3️⃣ const 不能这样用
const time = DateTime.now(); // ❌ 报错因为:
·DateTime.now() 只有运行时才知道结果
·编译阶段无法确定
四、final vs const(核心对比)
对比项 | final | const |
|---|---|---|
赋值次数 | 只能一次 | 只能一次 |
确定时机 | 运行时 | 编译时 |
是否可变 | 不可变 | 不可变 |
使用范围 | 更广 | 更严格 |
📌 一句话记忆:
能用 const,就不要用 final
五、final / const 与 List、Map
final List<int> numbers = [1, 2, 3];
numbers.add(4); // ✅ 允许解释:
·final 限制的是 变量指向
·不是集合内容
2️⃣ const 修饰集合
const List<int> numbers = [1, 2, 3];
// numbers.add(4); ❌ 报错📌 const 集合:
本身和内容都不可变
六、final / const 在类中的使用(非常重要)
class User {
final String name;
final int age;
User(this.name, this.age);
}好处:
·对象一旦创建,数据不可随意修改
·更安全
·更符合业务逻辑
📌 Flutter 中的 数据模型几乎都是 final 属性

七、为什么 Flutter 强烈推荐使用 const?
在 Flutter 中:
const Text('Hello');相比:
Text('Hello');const 的优势:
·Widget 可复用
·减少不必要的重建
·提升性能
📌 原则是:
UI 不变,就用 const
八、一个综合示例
class Product {
final String name;
final int price;
const Product(this.name, this.price);
}使用:
const Product p = Product('Book', 30);这里体现了:
·const 构造函数
·final 属性
·完整的不可变对象
九、什么时候该怎么选?
·普通变量 → var / 明确类型
·一次赋值,运行时确定 → final
·编译时确定的常量 → const
·类中属性 → 优先 final
·Flutter Widget → 优先 const
十、总结
本篇你已经学会了:
·final 和 const 的本质区别
·编译时 vs 运行时的真正含义
·为什么 Flutter 偏爱 const
·如何写出更安全、更高性能的代码
你已经从:
“能跑” → “写得规范、写得专业”
迈出了非常重要的一步。
🔜 下一篇预告
《Flutter 零基础入门(十一):空安全(Null Safety)基础》
下一篇我们将学习:
·什么是 null
·为什么会出现空指针错误
·Dart 的空安全机制
·?、! 的正确使用方式
这是 Dart 语言中:
最容易踩坑、但必须掌握的核心特性