首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flutter 零基础入门(十一):空安全(Null Safety)基础

Flutter 零基础入门(十一):空安全(Null Safety)基础

作者头像
LarryLan
发布2026-01-16 11:13:26
发布2026-01-16 11:13:26
750
举报

Flutter&Dart零基础入门教程(一)

...

Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字

Flutter 零基础入门(十):final、const 与不可变数据

Flutter 零基础入门(十一):空安全(Null Safety)基础

在前面的学习中,我们已经学会了:

·变量与数据类型

·List、Map、Class

·final、const 与不可变数据

但你在实际写 Dart 代码时,很可能已经遇到过类似提示:

·❌ A value of type 'null' can't be assigned

·❌ The property 'xxx' can't be accessed because it is potentially null

这些问题,都指向同一个核心概念: 👉 空安全(Null Safety)


一、什么是 null?

null 表示:

什么都没有 / 不存在 / 未赋值

例如:

·用户还没登录

·数据还没加载

·接口还没返回结果

在早期语言中,null 非常容易导致运行时崩溃(空指针异常)。


二、为什么 Dart 要引入空安全?

在没有空安全的情况下:

代码语言:javascript
复制
String name;
print(name.length); // ❌ 运行时崩溃

问题是:

·编译时不会报错

·错误在运行时才出现

📌 Dart 的目标是:

尽可能在编译阶段发现问题

于是就有了 Null Safety


三、默认情况下:变量不能为 null

在空安全开启后(Flutter 默认开启):

代码语言:javascript
复制
String name = 'Tom';
name = null; // ❌ 编译报错

结论:

默认情况下,所有变量都不允许为 null

这是 Dart 空安全的第一条核心规则。


四、可空类型:?

如果一个变量确实可能为空,你必须明确告诉 Dart。

1️⃣ 使用 ? 声明可空类型

代码语言:javascript
复制
String? name;

含义:

·name 可以是 String

·也可以是 null


2️⃣ 给可空变量赋值

代码语言:javascript
复制
String? name = null;
name = 'Tom';

这样写是完全合法的。


五、访问可空变量的问题

来看一个常见错误:

代码语言:javascript
复制
String? name = 'Tom';
print(name.length); // ❌ 报错

为什么?

因为:

·Dart 不确定 name 是否为 null

·如果是 null,访问 .length 就会崩溃


六、解决方式一:判空(if 判断)

代码语言:javascript
复制
if (name != null) {
  print(name.length);
}

这是最安全、最推荐的方式。

📌 原则:

先判断,再使用


七、解决方式二:!(非空断言)

代码语言:javascript
复制
print(name!.length);

! 的含义是:

“我保证这里一定不是 null”

⚠️ 注意:

·如果你判断错了

·程序仍然会在运行时崩溃

📌 使用建议:

少用、慎用、明确场景再用


八、解决方式三:?.(安全调用)

代码语言:javascript
复制
print(name?.length);

含义:

·如果 name 不为 null → 返回长度

·如果 name 为 null → 返回 null

这是 Dart 提供的非常优雅的写法


九、??:提供默认值

代码语言:javascript
复制
String? name;
print(name ?? 'Guest');

含义:

·如果 name 为 null

·就使用 'Guest'

📌 在 Flutter UI 中非常常见。


十、空安全与函数参数

1️⃣ 参数默认不可为空

代码语言:javascript
复制
void greet(String name) {
  print('Hello $name');
}

调用时:

代码语言:javascript
复制
greet(null); // ❌ 报错

2️⃣ 可空参数写法

void greet(String? name) { print('Hello ${name ?? 'Guest'}'); }


十一、空安全与类属性(非常重要)

代码语言:javascript
复制
class User {
  final String name;
  final int age;
  User(this.name, this.age);
}

这里:

·name、age 必须有值

·对象一旦创建就是“完整状态”

如果属性可能为空:

代码语言:javascript
复制
class User {
  String? avatar;
}

📌 Dart 强制你 在设计阶段就想清楚数据是否可能为空


十二、一个综合示例

代码语言:javascript
复制
class User {
  final String name;
  final int? age;
  User(this.name, this.age);
}
void printUser(User user) {
  print('姓名:${user.name}');
  print('年龄:${user.age ?? '未知'}');
}

这个例子体现了:

·可空类型

·?? 默认值

·空安全的真实用法


十三、空安全的核心思想总结

空安全不是为了让你多写符号,而是为了:

·提前发现问题

·减少运行时崩溃

·强迫你设计清晰的数据结构

📌 一句话理解:

Dart 不允许你“模棱两可”地使用数据


十四、总结

本篇你已经学会了:

·什么是 null

·什么是空安全

·?、!、?.、?? 的含义

·如何在变量、函数、类中使用空安全

你已经完成了从:

“随便用数据” → “严谨使用数据” 的关键升级


🔜 下一篇预告

《Flutter 零基础入门(十二):枚举(enum)与状态管理的第一步》

下一篇我们将学习:

·什么是 enum

·为什么 enum 比 int / String 更安全

·用 enum 表示状态

·为 Flutter 页面状态打基础

从下一篇开始,我们会逐步进入:

Flutter 状态与 UI 逻辑的核心世界

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Larry的Hub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Flutter&Dart零基础入门教程(一)
  • ...
  • Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字
  • Flutter 零基础入门(十):final、const 与不可变数据
  • Flutter 零基础入门(十一):空安全(Null Safety)基础
    • 1️⃣ 使用 ? 声明可空类型
    • 1️⃣ 参数默认不可为空
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档