使用 if 检查进行 Dart 空安全 [重复]

Posted

技术标签:

【中文标题】使用 if 检查进行 Dart 空安全 [重复]【英文标题】:Dart null safety with if check [duplicate] 【发布时间】:2022-01-19 16:18:14 【问题描述】:

我使用的是 Dart Null 安全版

有一个小部件:

itemBuilder 需要 Widget 类型。

footerWidget? 类型并且将为 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 空安全 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

dart空安全,Map中值如何累加

dart空安全,Map中值如何累加

▩Dart-深入理解空安全

删除空指针[重复]

▩Dart-空安全(Null Safety)

Dart 2.12 空安全