让我用简单的例子来解释这些关键字的区别:
1. var(变量)
就像一个可以换内容的盒子,但只能放同类型的东西:
var box = '苹果'; // 现在这个盒子只能装字符串
box = '香蕉'; // ✅ 可以,还是字符串
box = 1; // ❌ 错误,不能放数字进去
2. final(一次性)
像是用胶水封住的盒子,放进去就不能再换了:
final lunch = '炒饭'; // 午餐定好是炒饭了
lunch = '面条'; // ❌ 错误,不能改变了
// 可以在运行时确定值
final now = DateTime.now(); // 获取当前时间
3. const(永久性)
像是工厂里生产出来就固定的东西,从一开始就不能改:
const PI = 3.14; // 编译时就必须知道值
const name = getName(); // ❌ 错误,因为需要运行才知道值
// 常用于固定不变的值
const appName = 'My App';
const colors = [红色, 蓝色, 绿色];
4. static(共享)
像是班级里的公共财产,所有同学都可以用,不需要特定给某个同学:
class School {
static String schoolName = '第一中学'; // 学校名字是公共的
String studentName; // 每个学生有自己的名字
void printInfo() {
print(schoolName); // 可以直接用学校名
print(studentName); // 需要具体到某个学生
}
}
// 使用 static
School.schoolName; // 直接用,不需要新建学生
实际例子
class MyApp {
// var:不推荐用在类属性```
var count = 0;
// 不推荐这样写
// final:适合只赋值一次的属性
final String title;
// const:适合完全固定的值
static const String VERSION = '1.0.0';
// static:适合共享的数据
static int userCount = 0;
void example() {
// var:适合局部变量
var button = ElevatedButton(...);
var text = Text('Hello');
// final:适合不再变化的值
final user = await getUser();
// const:适合编译时就知道的值
const margin = EdgeInsets.all(16.0);
}
}
简单记忆
-
var: 可以改内容,但类型不能改
-
final: 一次性的,放进去就不能改了
-
const: 从始至终都不变的,必须一开始就知道值
-
static: 大家都能用的,不需要创建对象