使用 if 检查进行 Dart 空安全 [重复]
Posted
技术标签:
【中文标题】使用 if 检查进行 Dart 空安全 [重复]【英文标题】:Dart null safety with if check [duplicate] 【发布时间】:2022-01-19 16:18:14 【问题描述】:我使用的是 Dart Null 安全版
有一个小部件:
itemBuilder 需要 Widget 类型。
footer 是 Widget? 类型并且将为 null
为什么 Dart 会忽略我的 null 检查?我也只找到了一种解决方案:
if (footer != null && index == data.length)
return footer ?? const SizedBox();
【问题讨论】:
试一试 final _footer = footer; if (_footer != null && index == data.length) return _footer; 为什么它没有按预期工作?它的解释会很长。 将!
添加到页脚。 return footer!;
这被dart.dev/tools/non-promotion-reasons覆盖
【参考方案1】:
您可以使用此代码 sn-p 来检查变量是否为空
a != null && [do something]
【讨论】:
【参考方案2】:正确代码:
final footer = this.footer;
if (footer != null && index == data.length)
return footer;
为什么?因为这个类的子类可以覆盖页脚getter。 即:
Widget get footer
if (Random().nextBool()) return null;
else return super.footer;
因此,每次调用 footer
都可能返回 null。
就个人而言,我总是在检查后使用“!”(if (footer != null) footer!
)。因为为 getter 提供副作用是一种很大的代码气味。
【讨论】:
【参考方案3】:为什么 Dart 会忽略我的 null 检查?
因为当下面的代码执行时:
Widget? footer;
...
if (footer != null && index == data.length)
return footer;
您的 footer
有可能从代码的另一部分设置为 null
,因此会显示错误。
如果您完全确定footer
在其余生中不会被清空,您可以添加!
。所以,你可以使用这个:
if (footer != null && index == data.length)
return footer!;
但您的解决方案更安全,因为它始终检查 footer
是否为空:
if (footer != null && index == data.length)
// whenever footer is nulled, return SizedBox
return footer ?? const SizedBox();
【讨论】:
你的解释不对。如果您将页脚声明为 final(防止任何修改),错误仍然存在。 @AlexandrFarkas:OP 问题中没有最终代码。Although a final object cannot be modified, its fields can be changed. In comparison, a const object and its fields cannot be changed: they’re immutable.
dart.dev/guides/language/language-tour#final-and-const见***.com/questions/50431055/…以上是关于使用 if 检查进行 Dart 空安全 [重复]的主要内容,如果未能解决你的问题,请参考以下文章