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