Как инициализировать параметр класса значением по умолчанию

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
}
0
delmin 19 Апр 2020 в 14:33

2 ответа

Лучший ответ

Лучший способ сделать это, как прокомментировал Вячеслав Егоров, - инициализатор, если вам не нужно постоянное значение по умолчанию

И причина, по которой он работает при удалении конструктора, заключается в том, что это проблема с github:

Когда вы пишете f ({this.x}), это означает f ({this.x: null}).

Инициализаторы по умолчанию могут быть только константами, поэтому лучше всего ставить f ({Список x}): x = x ?? [ ] ;

Так было бы так:

class MyListClass {
  List myList;

  MyListClass({List myList}) : this.myList = myList ?? [];
}
0
LoVe 19 Апр 2020 в 14:58

Если вы хотите либо принять параметр, либо использовать значение по умолчанию, если этот параметр пропущен, вам нужно использовать что-то вроде второго примера:

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

(Обратите внимание, его нет this.myList в списке параметров конструктора, потому что вместо этого он инициализируется записью списка инициализатора).

Если значением по умолчанию является константа времени компиляции, вы можете использовать ее как фактическое значение параметра по умолчанию:

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

Это работает только тогда, когда значение по умолчанию является постоянным, и все же (до тех пор, пока не будет выпущена нулевая безопасность), есть риск, что кто-то передаст null в качестве явного аргумента. Первый пример заменяет null на [] независимо от того, происходит ли null из-за пропуска аргумента или явной передачи null.

(Я обычно предпочитаю первый подход, даже если значение по умолчанию является постоянным, потому что оно обрабатывает явные нули. С нулевой безопасностью это больше не понадобится).

1
lrn 20 Апр 2020 в 07:59