Dart:如何创建一个空列表作为默认参数

Jak*_*sMD 21 parameters default list dart flutter

我有多个列表,如果没有为它们分配任何内容,则默认情况下它们需要为空。但我收到这个错误:

class Example {
    List<String> myFirstList;
    List<String> mySecondList;

    Example({
        this.myFirstList = [];  // <-- Error: default value must be constant
        this.mySecondList = [];
    });
}
Run Code Online (Sandbox Code Playgroud)

但当然,如果我让它保持不变,我以后就无法更改它:

Example({
    this.myFirstList = const [];
    this.mySecondList = const [];
});

...

Example().myFirstList.add("foo"); // <-- Error: Unsupported operation: add (because it's constant)
Run Code Online (Sandbox Code Playgroud)

我找到了一种这样做的方法,但是我如何对多个列表执行相同的操作:

class Example {
    List<String> myFirstList;
    List<String> mySecondList;

    Example({
        List<String> myFirstList;
        List<String> mySecondList;
    }) : myFirstList = myFirstList ?? []; // <-- How can I do this with multiple lists?
}
Run Code Online (Sandbox Code Playgroud)

YoB*_*oBo 22

像这样

class Example {
    List<String> myFirstList;
    List<String> mySecondList;

    Example({
        List<String>? myFirstList,
        List<String>? mySecondList,
    }) : myFirstList = myFirstList ?? [], 
         mySecondList = mySecondList ?? [];
}
Run Code Online (Sandbox Code Playgroud)

如果您的类是不可变的(const 构造函数和 Final 字段),那么您需要在初始化表达式中使用 const []。

  • 谢谢!不敢相信我自己没有想到这一点;) (2认同)

小智 9

扩展 YoBo 的答案(因为我无法对此发表评论)

?请注意,启用空安全后,即使类成员被标记为非空,您也必须添加到构造函数中的字段;

class Example {
List<String> myFirstList;
List<String> mySecondList;

Example({
    List<String>? myFirstList,
    List<String>? mySecondList,
}) : myFirstList = myFirstList ?? [], 
     mySecondList = mySecondList ?? [];
}
Run Code Online (Sandbox Code Playgroud)

在构造函数中,您将可选参数标记为可空(因为在初始化中未指定,默认为空),然后??初始化程序部分中的空感知运算符可以执行该操作并在需要时创建一个空列表。

  • 谢谢。另外,如果您的类是不可变的(“const”构造函数和“final”字段),那么您需要在初始化表达式中使用“const []”。 (6认同)