Nullable
В Dart существует возможность делать "пустые" переменные, которые называются nullable.
Nullable переменные хранят в себе или значение указанного типа или null. Чтобы сделать переменную nullable требуется указать ? вместе с типом переменной, либо передать null.
dart
int? number = null; // будет лежать null
int? number; // будет лежать null
final str = null; // тип переменной будет Null
final String? str = null; // будет лежать nullДля работы с такими переменными у нас есть несколько операторов: !, ?., ??. Всегда обращаясь к переменной сначала делайте проверку на null.
Способы проверки на null
Операторы
- Оператор
!. Этот оператор называетсяNull assertion operator. Он говорит компилятору, что переменная точно не хранитnullи её можно использовать. Если значение всё жеnull, то будет выброшено исключениеNull check operator uer on a null value.
Пример с ошибкой:
dart
String? str = null;
print(str!);Пример без ошибки:
dart
String? str = 'asd';
print(str!); // output: asdDANGER
Никогда не допускайте использование этого оператора в production коде, т.к. этот оператор очень неконтролируем.
- Оператор
?.. Этот оператор часто используется в совокупности с функциями. Он позволяет вызывать функцию у переменной, если она неnull.
dart
String? str = null;
print(str?.isEmpty);// output: nulldart
String? str = 'asd';
print(str?.isEmpty); // output: false- Оператор
??. Этот оператор позволяет указать запасное значение на случай, если переменная равнаnull.
dart
String? str = null;
print(str ?? 'var is null'); // output: var is null- Оператор
??=. Этот оператор присваивает переменной значение только если она равнаnull.
dart
String? str = null;
str ??= 'John';
print(str); // output: John- Комбинация
?.и??. Эти операторы часто используются вместе:?.защищает от ошибки, а??возвращает запасное значение.
dart
String? str = null;
print(str?.length ?? 0);// output: 0Условия
- Обновления с Dart 3.9 В этой версии у нас появляются новые возможности проверок в рамках коллекции Map.
dart
String? password = null;
Map<String, dynamic> json = {
'name': 'John',
'password': ?password // это поле будет записано только в случае, если password имеет значение.
};- Проверки с помощью
if. Чтобы убедиться в наличии значения у переменной так же можно использоватьif.
dart
String? name = null;
if(name != null) {
print(name);
}Переменная не будет выведена, т.к. name = null.