Dart 中的 关键字 与 修饰符
引言按功能区分。
·
引言
按功能区分
- 不可变相关
- 可变相关
- 其它辅助修饰符
第一类 不可变相关
此类关键字的核心是“限制变量修改”,确保代码可预测性(常用于Flutter中组件属性、状态管理变量)
| 关键字 | 核心作用 | 关键区别 | 适用场景 | 示例 |
|---|---|---|---|---|
final |
不可重复赋值,运行时初始化 | 赋值时机:声明时 / 构造函数中(运行时确定值);类型可推导 | 组件属性、运行时才确定值的变量(如接口返回数据) | final name = "Flutter";final int age = getAge();(getAge () 是函数,运行时返回值) |
const |
编译时常量,不可变且值必须编译时确定 | 赋值时机:编译时(值必须是字面量或编译时常量);修饰对象时,对象本身也不可变(深不可变) | 固定常量(如颜色、尺寸、常量配置) | const int maxCount = 100;const Color red = Color(0xFFFF0000);const List<int> fixedList = [1,2,3];(列表内部也不能改) |
late final |
延迟初始化的不可变变量(Dart 2.12+ 空安全) | 声明时不赋值,后续首次使用前必须赋值;赋值后不可改 | 需要先做准备工作再初始化的变量(如初始化耗时的对象) | late final String token;void init() { token = getTokenFromServer(); }(首次使用前赋值) |
关键对比:final vs const
- 赋值时机:
final运行时确定值,const编译时确定值; - 对象不可变性:
final修饰对象→仅引用不可变(内部可改),const修饰对象→深不可变(内部也不能改); - 性能:
const是编译时常量,运行时无需重新创建,性能略优; - 场景:能⽤
const就用const(如固定配置),运行时才确定值就用final(如接口数据)。
第二类 可变相关
这类关键字声明的变量可以重复赋值,对应“可变状态”
| 关键字 / 用法 | 核心作用 | 关键区别 | 适用场景 | 示例 |
|---|---|---|---|---|
var |
可变变量,类型自动推导 | 无需显式写类型,Dart 自动根据赋值推导;可重复赋值 | 临时变量、无需固定类型的变量 | var count = 10;count = 20;(允许修改)var name = "Dart";name = "Flutter";(类型推导为 String,不能赋值其他类型) |
| 显式类型 | 可变变量,指定具体类型(如 int、String) |
类型固定,只能赋值该类型的值;可重复赋值 | 类型明确的可变状态(如计数器、输入框内容) | int age = 20;age = 21;(允许修改)String message = "Hello";message = "Hi"; |
dynamic |
动态类型(弱类型),完全不做类型检查 | 可赋值任意类型,编译时不校验,运行时可能报错 | 极少数需要动态类型的场景(如跨语言交互) | dynamic value = 10;value = "Hello";(允许切换类型)value = true; |
var是 “类型推导的可变变量”,不是关键字,但其功能是 “可变”,和final对立;- 优先使用
var或显式类型(如int),避免用dynamic(失去类型安全,容易出错)。
第三类 其它辅助修饰符
这类关键字不直接控制“是否可变”,但会影响变量的作用域、初始化时机等
| 关键字组合 | 核心作用 | 关键区别 | 适用场景 | 示例 |
|---|---|---|---|---|
late(单独用) |
延迟初始化的可变变量(空安全特性) | 声明时不赋值,首次使用前必须赋值;可重复修改 | 可变且初始化耗时的变量(如大对象、需要异步初始化的变量) | late String username;void init() { username = "user123"; }username = "user456";(允许修改) |
static |
静态变量 / 方法(属于类,不属于实例) | 不依赖类的实例,直接通过 “类名。变量名” 访问;可变 / 不可变由 final 决定 |
类级别的常量、共享状态(如工具类的常量) | static int maxRetries = 3;(可变,可通过类名修改)static final String appName = "MyApp";(不可变,类级常量) |
static final |
类级别的不可变常量(编译时 / 运行时均可) | 属于类,全局唯一,不可重复赋值;常用作全局配置 | 应用全局常量(如接口地址、固定参数) | class AppConfig {static final String baseUrl = "https://api.example.com";static final int timeout = 5000;} |
static const |
类级别的编译时常量(性能最优) | 编译时确定值,全局唯一,深不可变 | 全局固定常量(如颜色、尺寸、枚举值) | class AppColors {static const Color primary = Color(0xFF2196F3);static const double padding = 16.0;} |
结合Flutter开发中高频使用场景
| 场景 | 推荐关键字 | 示例 |
|---|---|---|
| Flutter 组件的属性(StatelessWidget) | final |
final int count;(组件构造函数传入,不可改) |
| 全局配置常量(如接口地址、颜色) | static const |
static const String baseUrl = "xxx"; |
| 运行时确定的值(如接口返回数据) | final |
final User user = await getUser(); |
| 可变状态(如计数器、输入框内容) | var / 显式类型 |
var count = 0;(点击按钮后 count++) |
| 延迟初始化的不可变变量(异步初始化) | late final |
late final List<Data> dataList;(异步加载后赋值) |
| 延迟初始化的可变变量(大对象) | late |
late final LargeData largeData;(改为 late LargeData largeData; 可变) |
快速选型
- 不可变 → 优先
const(编译时确定),否则final(运行时确定); - 可变 → 优先
var(类型推导)或显式类型(如int),避免dynamic; - 类级变量 → 加
static(可变用static,不可变用static final/static const); - 延迟初始化 → 不可变用
late final,可变用late。
更多推荐

所有评论(0)