#flutter #dart #null #nullable #elvis-operator
Вопрос:
1 factory SuggestSessionResult.fromJson(Map<String, dynamic> json) {
2 final String? error = json['error'];
3 final List<Map<String, dynamic>>? items = json['items'];
4 return SuggestSessionResult(
5 items
6 ?.map((it)=>SuggestItem.fromJson(it))
7 .toList(),
8 error
);
}
Привет!
Как вы можете видеть, я не использовал оператор с нулевым значением в строке 7, и это нормально для компилятора. Более того, когда я его использую, анализатор говорит, что приемник не может быть нулевым.
Почему так?
Ответ №1:
В дротике 2.12 ?.
было произведено короткое замыкание.
Из документа «Понимание безопасности»:
Чтобы решить эту проблему, мы позаимствовали умную идею из дизайна C#той же функции. При использовании оператора с нулевым значением в цепочке методов, если получатель оценивает значение
null
, вся остальная цепочка методов замыкается и пропускается.
В вашем случае .map()
, если вызывается , не может вернуться null
(потому Iterable.map
что не возвращает тип, допускающий значение null). Поэтому .toList()
либо никогда не будет вызван (потому .map()
что не был вызван ранее в цепочке методов), либо будет гарантированно вызван по ненулевому значению.