引言

        按功能区分

  •         不可变相关
  •         可变相关
  •         其它辅助修饰符

第一类  不可变相关

此类关键字的核心是“限制变量修改”,确保代码可预测性(常用于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,不能赋值其他类型)
显式类型 可变变量,指定具体类型(如 intString 类型固定,只能赋值该类型的值;可重复赋值 类型明确的可变状态(如计数器、输入框内容) 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

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐