【问题标题】:Dart null safety with if check [duplicate]使用 if 检查进行 Dart 空安全 [重复]
【发布时间】: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!;

标签: flutter dart dart-null-safety


【解决方案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();
      }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多