在前面的学习中,我们已经掌握了:
?!但你在阅读 Flutter 代码或示例时,一定见过这种写法:
late String title;
或者:
late final User user;
这一篇,我们就来彻底讲清楚: 👉 late 是什么?为什么要用?什么时候用?
先来看一个问题场景。
class Page {
String title;
Page() {
title = '首页';
}
}
❌ 这段代码在空安全下是不允许的。
为什么?
因为:
title 是非空类型但你又确实希望:
👉 这就是 late 要解决的问题。
late 的含义是:
“这个变量现在不初始化,但我保证稍后一定会初始化”
你是在对编译器做一个承诺。
late String title;
void main() {
title = 'Hello';
print(title);
}
特点:
String? name;
late String name;
📌 本质区别:
? 是“可能没有值” late 是“一定会有值,但现在还没有”
class User {
late String name;
User(String n) {
name = n;
}
}
这样写的好处:
?late final String token;
含义是:
class Auth {
late final String token;
void login() {
token = 'abc123';
}
}
📌 这是 Flutter 中极其常见的写法。
如果你使用了 late,但忘了赋值就访问:
late String name;
void main() {
print(name); // ❌ 运行时异常
}
注意:
📌 所以 late 是一种责任型关键字。
你可以在以下情况考虑使用:
✅ 变量一定会有值 ✅ 但无法在声明时确定 ✅ 且使用前一定会赋值
典型场景:
❌ 数据真的可能不存在 ❌ 需要频繁判空 ❌ 初始化时机不确定
这些情况: 👉 用 ? 更安全
场景 | 推荐 |
|---|---|
可能为空 | ? |
一定有值,但晚点给 | late |
只赋值一次 | late final |
不确定是否会赋值 | 不用 late |
class Profile {
late final String userId;
late String name;
Profile(String id) {
userId = id;
name = 'Guest';
}
}
这里:
在 Flutter 中,late 常用于:
State 类中的变量你现在看到的很多 Flutter 示例代码,已经完全能看懂 为什么要用 late 了。
你已经完成了 Dart 变量系统的完整闭环。
这一篇之后,你对 Dart 中:
已经形成了清晰的判断标准。
你写的代码会越来越像:
“有设计意识的工程代码”
《Flutter 零基础入门(十四):Dart 抽象类(abstract)与接口思想》
下一篇我们将学习:
从这一篇开始:
你将真正进入 Flutter 架构思维