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: asd
DANGER
Никогда не допускайте использование этого оператора в production коде, т.к. этот оператор очень неконтролируем.
- Оператор
?.
. Этот оператор часто используется в совокупности с функциями. Он позволяет вызывать функцию у переменной, если она неnull
.
dart
String? str = null;
print(str?.isEmpty);// output: null
dart
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
.