Как обработать значение null для предупреждения: Операнд операции с нулевым значением

#flutter #dart

Вопрос:

static String lang ='';

lang должно быть String не String? потому, что я хочу использовать lang.contains()

Однако мой код выглядит так

 static String lang ='';
List? languages = [];
languages = await Devicelocale.preferredLanguages;// it returns List<dynamic>
lang = languages![0];
 

Он может быть скомпилирован, но это предупреждение появляется.

 lib/commonfunc.dart:48:25: Warning: Operand of null-aware operation '!' has type 'List<dynamic>' which excludes null. - 'List' is from 'dart:core'.
 

Как это можно решить??

Можно ли бросить String? в String

Ответ №1:

Вы должны стараться никогда не использовать a ! . Переменные могут быть обнулены по ряду причин, они могут быть нулевыми, и ваш компилятор очень хорошо справляется с этим. Не пытайтесь быть умнее своего компилятора, используя a ! .

Вы можете использовать if операторы s или null , такие как ? or ?? , но не предполагайте, что что-то не может быть нулевым, когда на самом деле это может быть и будет. Вам нужно справиться с этой ситуацией, а не игнорировать ее:

 String lang ='';
String fallbackLanguage = 'en';

List<dynamic>? languages = await Devicelocale.preferredLanguages;

lang = languages?.first ?? fallbackLanguage;
 

Ответ №2:

Используйте whereType<String> для фильтрации типа, который вы ищете, и создания нового списка List<String> (ненулевого).

 final List<dynamic> languages = await Devicelocale.preferredLanguages;
final preferredLangs = languages.whereType<String>();
 

Образец:

 void main() {
  final List<dynamic> fakeSource = ["one", null, "two", "three"];
  final nonNull = fakeSource.whereType<String>();
  
  print(nonNull);
}

 

Ответ №3:

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

     static String lang ='';
        List? languages = [];
        languages = await Devicelocale.preferredLanguages;
        if(languages?.isNotEmpty ==true){
           lang = languages[0] ?? "en";
        }else{ 
        lang = "en";
        }
 

Комментарии:

1. Что произойдет lang , если языки действительно пусты? Хуже того, что происходит с languages.isNotEmpty тем, что языки is равны нулю?

2. вам нужно установить язык по умолчанию в другом

Ответ №4:

Вы должны добавить взрыв ! в конце languages[0]! , чтобы удалить возможность аннулирования.

Комментарии:

1. Использование a ! предназначено для тех очень редких исключительных ситуаций, когда вы, как программист, знаете , что оно не может быть нулевым, но ваш компилятор не может это доказать. Вы, как программист, в данном случае понятия не имеете, может ли это стать нулевым, поэтому использование a ! просто неправильно и может привести к ошибке.

2. Я знаю, что вы имеете в виду , однако вопрос заключался в том, как он может преобразовать а String? в String , ответ примерно такой, я не принимаю во внимание контекст, но я понимаю вашу точку зрения.

3. Без контекста ответ все равно будет совершенно неправильным. Вы конвертируете, проверяя значение null и действуя соответственно, а не отключая функции безопасности компилятора и слепо предполагая, что оно не равно нулю.