Что такое null safety в Dart?

«Что такое null safety в Dart?» — вопрос из категории Dart Core, который задают на 67% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Null safety — это набор функций языка Dart, который делает типы не nullable по умолчанию. Это означает, что переменная не может содержать null, если вы явно не разрешите это. Цель — устранить ошибки времени выполнения, связанные с разыменованием null (Null Pointer Exceptions), на этапе компиляции.

Ключевые концепции:

  1. Non-nullable по умолчанию: String name = 'Alex';name никогда не может быть null.
  2. Nullable типы: Чтобы разрешить null, используется ?. String? nickname;nickname может быть строкой или null.
  3. Обязательная инициализация: Non-nullable переменные должны быть инициализированы до использования.

Операторы для работы с nullable-переменными:

  • ?. (Опциональный доступ): Вызывает метод или получает свойство только если объект не null.
    String? maybeText;
    int? length = maybeText?.length; // length будет null, если maybeText null
  • ?? (Оператор если-null): Предоставляет значение по умолчанию.
    String displayName = nickname ?? 'Гость';
  • ! (Оператор утверждения не-null): Говорит компилятору: "Я уверен, что это значение не null сейчас". Использовать с осторожностью, так как при ошибке вызовет исключение во время выполнения.
    String definitelyText = maybeText!; // Runtime error, если maybeText null
  • late: Откладывает инициализацию non-nullable переменной. Вы обещаете присвоить значение до первого использования.
    late String apiKey;
    void init() {
      apiKey = fetchKeyFromConfig(); // Инициализируем позже
    }

Практический эффект: Код становится более предсказуемым, а анализ потока данных (flow analysis) компилятора помогает "видеть", когда nullable-переменная в определенной точке кода гарантированно не является null, позволяя использовать ее без лишних проверок.