Skip to content

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

Операторы

  1. Оператор !. Этот оператор называется 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 коде, т.к. этот оператор очень неконтролируем.

  1. Оператор ?.. Этот оператор часто используется в совокупности с функциями. Он позволяет вызывать функцию у переменной, если она не null.
dart
String? str = null;

print(str?.isEmpty);// output: null
dart
String? str = 'asd';

print(str?.isEmpty); // output: false
  1. Оператор ??. Этот оператор позволяет указать запасное значение на случай, если переменная равна null.
dart
String? str = null;

print(str ?? 'var is null'); // output: var is null
  1. Оператор ??=. Этот оператор присваивает переменной значение только если она равна null.
dart
String? str = null;

str ??= 'John';

print(str); // output: John
  1. Комбинация ?. и ??. Эти операторы часто используются вместе: ?. защищает от ошибки, а ?? возвращает запасное значение.
dart
String? str = null;

print(str?.length ?? 0);// output: 0

Условия

  1. Обновления с Dart 3.9 В этой версии у нас появляются новые возможности проверок в рамках коллекции Map.
dart
String? password = null;

Map<String, dynamic> json = {
    'name': 'John',
    'password': ?password // это поле будет записано только в случае, если password имеет значение.
};
  1. Проверки с помощью if. Чтобы убедиться в наличии значения у переменной так же можно использовать if.
dart
String? name = null;

if(name != null) {
    print(name);
}

Переменная не будет выведена, т.к. name = null.