Flutter&Dart零基础入门教程(一)
Flutter 零基础入门(二):Dart 字符串与字符串插值
Flutter 零基础入门(三):条件判断与逻辑运算
Flutter零基础入门(四):switch、多分支判断与循环
Flutter零基础入门(五):List列表与遍历
Flutter 零基础入门(六):Map 键值对与简单数据模型
Flutter 零基础入门(七):函数(Function)与代码封装
Flutter 零基础入门(八):Dart 类(Class)与对象(Object)
Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字
Flutter 零基础入门(十):final、const 与不可变数据
在前面的学习中,我们已经用过很多变量:
dart
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:运行时确定,只能赋值一次
1️⃣ final 的基本用法
final String name = 'Tom';
特点:
-
只能赋值一次
-
赋值后不可再修改
final int age = 18;
// age = 20; ❌ 报错
2️⃣ 什么是"运行时确定"?
看一个例子:
final time = DateTime.now();
这里的 time:
- 在写代码时不知道具体值
- 只有程序运行时才能确定
📌 这种情况:
只能用 final,不能用 const
三、const:编译时就必须确定的常量
1️⃣ 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
1️⃣ final 修饰集合
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 语言中:
最容易踩坑、但必须掌握的核心特性