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 语言中:

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

相关推荐
源代码•宸2 小时前
Leetcode—1266. 访问所有点的最小时间【简单】
开发语言·后端·算法·leetcode·职场和发展·golang
遇见~未来2 小时前
JavaScript数组全解析:从本质到高级技巧
开发语言·前端·javascript
南屿欣风2 小时前
Sentinel 熔断规则 - 异常比例(order & product 示例)笔记
java·开发语言
u0104058362 小时前
使用Java实现高性能的异步编程:CompletableFuture与Reactive Streams
java·开发语言
行者962 小时前
Flutter跨平台开发:安全检测组件适配OpenHarmony
flutter·harmonyos·鸿蒙
朔北之忘 Clancy2 小时前
2020 年 6 月青少年软编等考 C 语言二级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·尺取法
消失的旧时光-19432 小时前
C++ 中的 auto 与 nullptr:不是语法糖,而是类型系统升级
开发语言·c++
专注VB编程开发20年2 小时前
c#Type数组转成字符串的名称
java·开发语言
编程饭碗3 小时前
【多线程编程】
java·开发语言