Flutter如何正确检查Map是否为null或空?
Dart/Flutter Map空状态正确检查方案
现有检查方式错误原因
- 检查1
allAvailableTime == null本身逻辑没有问题,你遇到的type 'String' is not a subtype of type 'Widget报错是三元表达式两个分支返回值类型不匹配导致,和空检查逻辑无关,通常是你一个分支返回了字符串、另一个返回了Widget组件导致。 - 检查2
allAvailableTime == {}不生效是因为Dart默认使用引用相等判断,你代码里的{}是新创建的空Map实例,和原变量引用的不是同一个对象,哪怕原变量也是非null的空Map,比较结果也会是false,更别说原变量初始值为null的场景。 - 检查3 直接调用
allAvailableTime.isEmpty会抛空指针,是因为变量初始值为null时,调用null对象的属性/方法会直接触发运行时异常。
正确实现方式
你需要同时覆盖「变量为null」「变量非null但为空Map」两种空状态场景,有两种实现方案:
方案1:空安全版本(Dart 2.12+ 推荐)
使用空调用运算符?. + 空值默认运算符??组合判断:
// 条件返回true时代表是空状态 if (allAvailableTime?.isEmpty ?? true) { // 空状态逻辑 }
逻辑说明:如果allAvailableTime为null,allAvailableTime?.isEmpty会返回null,此时?? true会将null的场景默认判定为空状态;如果变量非null,就直接返回isEmpty的真实结果。
如果是在Flutter组件树中使用,要保证三元表达式两个分支都返回Widget类型:
allAvailableTime?.isEmpty ?? true ? const Text('暂无可用时间') : AvailableTimeList(data: allAvailableTime)
方案2:非空安全版本
分开做两次判断即可:
if (allAvailableTime == null || allAvailableTime.isEmpty) { // 空状态逻辑 }
优化建议
如果变量初始化后不会被赋值为null,推荐直接给变量赋初始空Map值,后续就不需要做空判断:
Map<String,dynamic> allAvailableTime = {};
内容的提问来源于stack exchange,提问作者icantcode
相关产品推荐
相关产品推荐

