使用默认值初始化类参数

时间:2020-04-19 11:33:42

标签: flutter dart

如何使用默认值初始化类参数

void main() {
  Test t = Test();
  print(t.l); //<-prints null, should print []
}

class Test{
  List l=[];
  Test({this.l});
}

我认为这以前对我有用,但由于某种原因,它现在不起作用

void main() {
  Test t = Test();
  print(t.l); 
}

class Test{
  List l;
  Test({this.l}) : l = l ?? []; //<- as from GitHub this doesn't work either
}

2 个答案:

答案 0 :(得分:1)

如果要 接受参数或在省略参数时使用默认值,则需要使用类似第二个示例的内容:

class MyListClass {
  final List myList;
  MyListClass({List myList}) : myList = myList ?? [];
}

(注意,它不是在构造函数参数列表中的this.myList,因为它是由初始化列表项进行初始化的。)

如果默认值为编译时常量,则可以将其用作实际参数默认值:

class MyListClass {
  final List myList;
  MyListClass({this.myList = const []});
}

仅当默认值恒定时才起作用,并且它仍然(直到Null Safety被释放)冒着将null作为显式参数传递的风险。第一个示例无论null来自省略自变量还是显式传递[]都将null替换为null

(即使默认值是常量,我也倾向于使用前一种方法,因为它处理显式的null。使用Null Safety,就不再需要此方法。)

答案 1 :(得分:0)

VyacheslavEgorov所说的最好方法是通过初始化程序,如果您不希望使用const默认值

根据从github上的this问题来看,删除构造函数时它起作用的原因是:

写f({this.x})意味着f({this.x:null})。

默认初始值设定项只能是常量,因此最好的选择是 f({List x}):x = x ?? [];

所以会是这样:

class MyListClass {
  List myList;

  MyListClass({List myList}) : this.myList = myList ?? [];
}