【问题标题】:List null safety Flutter列出空安全 Flutter
【发布时间】:2021-09-11 22:34:47
【问题描述】:

如果在 Flutter 中使用 null 安全性而不使用 required 关键字,如何在构造函数中初始化 List<Object>

我有以下代码:

List<String> test = [];
MyConstructor({this.test});

有一个编译错误告诉我添加 required 关键字,但如果我这样做:

List<String> test = [];
MyConstructor({this.test=[]});

这给了我一个错误,the default value of a named param must be constant
当然,我可以输入 required 关键字,一切都很好,但是在我的所有构造函数中,我需要添加一个空的 List,这很无聊,因为只有 10% 的时间我需要传递一个非空的 @987654329 @。

您能简单地确认required 关键字是唯一的选项吗?

谢谢

【问题讨论】:

    标签: flutter dart


    【解决方案1】:
    • 使用const 初始化器:

      List<String> test;
      MyConstructor({this.test = const []});
      

      但是,如果您稍后需要更改您的 List(并且如果您的 List 成员也是 final 则无法更改),这将很尴尬。

    • 将参数标记为required

    • 使参数(但不是成员)可以为空:

      List<String> test;
      MyConstructor({List<String>? test})
        : test = test ?? [];
      

      另见:The default value of an optional parameter must be constant

    • 使成员和参数都可以为空。

    【讨论】:

    • 非常感谢,我可以使用您的最后一个语法来使用多个List 进行初始化吗?我知道这可能超出了这个问题的范围,但我可以用VoidCallback(函数)对象实现类似的东西吗?还是应该始终要求它们?
    • 谢谢@TirthPatel!我接受了这个答案,因为它提供了这种我不知道的新方法,我不想使用位置参数
    • 没关系。我是来帮忙的,不是来积分的 :D
    【解决方案2】:

    你可以改用位置参数。

    class MyConstructor {
      List<String> test = [];
      MyConstructor(this.test);
    }
    

    您可以使用 const 文字作为带有可选参数的默认值。

    class MyConstructor {
      List<String> test = [];
      MyConstructor({this.test = const []});
    }
    

    【讨论】:

    • 顺便说一句,位置与命名与必需与可选正交。 可选位置参数也会有同样的问题。
    • 没找到你,你能再来一次吗?
    • 你的例子并没有避免这个问题,因为它使用了一个 positional 的参数;它避免了这个问题,因为它使用了 required 参数(恰好是位置参数)。如果该参数是一个可选的位置参数(即MyConstructor([this.test = []])),它会遇到同样的问题,即需要一个非空的const 默认值。
    【解决方案3】:

    只需在空列表前添加 const,如下所示:

      List<String> test = [];
      MyConstructor({this.test = const []});
    

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 2022-01-23
      • 1970-01-01
      • 2021-08-04
      • 2021-07-14
      • 2021-08-13
      • 2021-06-30
      • 1970-01-01
      • 2021-08-09
      相关资源
      最近更新 更多