首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flutter 零基础入门(十):final、const 与不可变数据

Flutter 零基础入门(十):final、const 与不可变数据

作者头像
LarryLan
发布2026-01-16 11:13:17
发布2026-01-16 11:13:17
1320
举报

Flutter&Dart零基础入门教程(一)

...

Flutter 零基础入门(八):Dart 类(Class)与对象(Object)

Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字

Flutter 零基础入门(十):final、const 与不可变数据

在前面的学习中,我们已经用过很多变量:

代码语言:javascript
复制
String name ='Tom';
int age =18;

你可能也已经见过这样的写法:

代码语言:javascript
复制
final String name = 'Tom';
const String city = 'Beijing';

甚至在 Flutter 中,经常看到:

代码语言:javascript
复制
const Text('Hello Flutter')

那么问题来了:

·final 和 const 有什么区别?

·什么叫“编译时确定”和“运行时确定”?

·为什么 Flutter 强烈推荐使用 const?

这一篇,我们把这些一次性讲清楚


一、为什么需要 final 和 const?

先看一个普通变量:

代码语言:javascript
复制
String name = 'Tom';
name = 'Jack';

这是允许的,因为普通变量是 可变的

但在很多场景中:

·数据一旦确定,就不应该再被修改

·修改反而可能引入 Bug

这时,就需要 不可变变量


二、final:运行时确定,只能赋值一次

1️⃣ final 的基本用法

代码语言:javascript
复制
final String name = 'Tom';

特点:

·只能赋值一次

·赋值后不可再修改

代码语言:javascript
复制
final int age = 18;
// age = 20; ❌ 报错

2️⃣ 什么是“运行时确定”?

看一个例子:

代码语言:javascript
复制
final time = DateTime.now();

这里的 time:

·在写代码时不知道具体值

·只有程序运行时才能确定

📌 这种情况:

只能用 final,不能用 const


三、const:编译时就必须确定的常量

1️⃣ const 的基本用法

代码语言:javascript
复制
const String name = 'Tom';
const int age = 18;

特点:

·值在 编译阶段就必须确定

·完全不可变


2️⃣ 什么是“编译时确定”?

意思是:

在写代码的时候,值就已经是一个确定的常量

例如:

代码语言:javascript
复制
const String city = 'Beijing';
const int maxCount = 10;

这些值:

·不依赖运行环境

·不依赖计算结果

·不依赖函数调用


3️⃣ const 不能这样用

代码语言:javascript
复制
const time = DateTime.now(); // ❌ 报错

因为:

·DateTime.now() 只有运行时才知道结果

·编译阶段无法确定


四、final vs const(核心对比)

对比项

final

const

赋值次数

只能一次

只能一次

确定时机

运行时

编译时

是否可变

不可变

不可变

使用范围

更广

更严格

📌 一句话记忆:

能用 const,就不要用 final


五、final / const 与 List、Map

1️⃣ final 修饰集合

代码语言:javascript
复制
final List<int> numbers = [1, 2, 3];
numbers.add(4); // ✅ 允许

解释:

·final 限制的是 变量指向

·不是集合内容


2️⃣ const 修饰集合

代码语言:javascript
复制
const List<int> numbers = [1, 2, 3];
// numbers.add(4); ❌ 报错

📌 const 集合:

本身和内容都不可变


六、final / const 在类中的使用(非常重要)

代码语言:javascript
复制
class User {
  final String name;
  final int age;
  User(this.name, this.age);
}

好处:

·对象一旦创建,数据不可随意修改

·更安全

·更符合业务逻辑

📌 Flutter 中的 数据模型几乎都是 final 属性


七、为什么 Flutter 强烈推荐使用 const?

在 Flutter 中:

代码语言:javascript
复制
const Text('Hello');

相比:

代码语言:javascript
复制
Text('Hello');

const 的优势:

·Widget 可复用

·减少不必要的重建

·提升性能

📌 原则是:

UI 不变,就用 const


八、一个综合示例

代码语言:javascript
复制
class Product {
  final String name;
  final int price;
  const Product(this.name, this.price);
}

使用:

代码语言:javascript
复制
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 语言中:

最容易踩坑、但必须掌握的核心特性

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Larry的Hub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Flutter&Dart零基础入门教程(一)
  • ...
  • Flutter 零基础入门(八):Dart 类(Class)与对象(Object)
  • Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字
  • Flutter 零基础入门(十):final、const 与不可变数据
    • 1️⃣ final 的基本用法
    • 1️⃣ const 的基本用法
    • 1️⃣ final 修饰集合
    • 实用选择指南:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档