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

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')

那么问题来了:

  • finalconst 有什么区别?
  • 什么叫"编译时确定"和"运行时确定"?
  • 为什么 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 语言中:

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

相关推荐
Zach_yuan5 分钟前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
云姜.10 分钟前
java多态
java·开发语言·c++
CoderCodingNo19 分钟前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
陳103026 分钟前
C++:红黑树
开发语言·c++
一只大侠的侠30 分钟前
Flutter开源鸿蒙跨平台训练营 Day 3
flutter·开源·harmonyos
一切尽在,你来31 分钟前
C++ 零基础教程 - 第 6 讲 常用运算符教程
开发语言·c++
泉-java33 分钟前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
weixin_499771551 小时前
C++中的组合模式
开发语言·c++·算法
初级代码游戏1 小时前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
_waylau1 小时前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙