Почему сопоставление нулевой коллекции всегда не равно нулю в dart?

#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() что не был вызван ранее в цепочке методов), либо будет гарантированно вызван по ненулевому значению.