【问题标题】:Dart Null Safety in a callback function with named params带有命名参数的回调函数中的 Dart Null 安全性
【发布时间】:2021-04-28 02:09:00
【问题描述】:

以下代码在使用 Null Safety 编译时失败,出现以下错误:

参数namedParam因其类型不能有null的值,并且没有提供非空默认值

void main() {
  Foo(callbackWithNamedParam: ({namedParam}) { 
    print('param=$namedParam');
  }).callback();
}

class Foo {
  final void Function({required int namedParam}) callbackWithNamedParam;
  
  Foo({required this.callbackWithNamedParam});
  
  void callback() {
    callbackWithNamedParam(namedParam: 10);
  }
}

在没有 Null Safety 的情况下编译时,代码编译得非常好。

DartPad with 编译失败的 Null Safety

DartPad without 编译良好的 Null Safety

有没有办法解决:

  1. 不切换到位置参数
  2. 不做命名参数nullable?

【问题讨论】:

    标签: dart dart-null-safety


    【解决方案1】:

    添加Randal's 答案。来自Dart's documentation

    所以为了解决我的问题,我不得不将required 添加到匿名函数中

    Foo(callbackWithNamedParam: ({required namedParam}) { 
                                  ^^^^^^^^
        print('param=$namedParam');
      }).callback();
    

    我的工作代码可以在这个Dartpad中找到

    【讨论】:

      【解决方案2】:

      将您的命名参数设为int?。然后它将接受 int 或 null:

      final void Function({int? namedParam}) callbackWithNamedParam;
      

      【讨论】:

      • 谢谢,它适用于可为空的命名参数,但我不想让它为空。我澄清了这个问题。
      • 好吧。我完全错过了。我还需要将required 添加到匿名函数中。感谢您让我重新检查我的代码。
      • 您能否澄清这两种情况(可空和不可空)参数,以便为其他开发人员提供完整的答案?谢谢。
      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 2017-08-15
      • 2021-11-05
      • 2021-08-12
      • 2020-11-08
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多