← Назад к вопросам

Что такое Null?

1.0 Junior🔥 201 комментариев
#Dart

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Null в Dart

Null — это специальное значение, которое указывает на отсутствие значения или неинициализированное состояние переменной. В Dart это фундаментальная концепция, особенно с введением null safety в Dart 2.12.

Основные концепции

Nullable и Non-nullable типы

Dart 3.x требует явного указания, может ли переменная быть null:

// Non-nullable — не может быть null
String name = "John";
int age = 25;

// Nullable — может быть null (знак "?")
String? description;
int? optionalAge;

// По умолчанию переменные non-nullable
String email = null; // Ошибка компиляции!
String? email = null; // OK

Null Safety (Безопасность от null)

Это система типов, которая помогает избежать NullPointerException (NPE) на этапе компиляции:

String? getUserName() {
  return null;
}

void printName() {
  String? name = getUserName();
  
  // Ошибка! Не можешь использовать nullable значение как non-nullable
  // print(name.length);
  
  // Нужна проверка
  if (name != null) {
    print(name.length); // Теперь OK
  }
}

Работа с Null значениями

Null-coalescing operator (??)

Предоставляет дефолтное значение, если переменная null:

String? nickname;
String displayName = nickname ?? "Anonymous";
// Если nickname == null, displayName = "Anonymous"

Null-coalescing assignment operator (??=)

Присваивает значение только если переменная null:

String? nickname;
nickname ??= "Guest"; // nickname = "Guest" если была null

Conditional access (?.)

Безопасный доступ к свойствам nullable объектов:

class User {
  String? email;
}

User? user;
String? emailLength = user?.email?.length.toString();
// Если user или email == null, результат будет null

Force unwrap (!)

Принудительное преобразование nullable в non-nullable:

String? name = "John";
String nonNullName = name!; // OK если name не null

String? empty;
String forced = empty!; // Runtime Error

Практические примеры

Безопасная работа с API ответами

Future<User?> fetchUser(String id) async {
  try {
    final response = await http.get(Uri.parse('/users/$id'));
    if (response.statusCode == 200) {
      return User.fromJson(jsonDecode(response.body));
    }
  } catch (e) {
    print("Error: $e");
  }
  return null;
}

Optional widget rendering

class UserProfile extends StatelessWidget {
  final String? bio;
  
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text("Profile"),
        if (bio != null) Text(bio!),
      ],
    );
  }
}

Late переменные

Для переменных, которые будут инициализированы позже:

late String largeData;

void initialize() {
  largeData = "Heavy computation result";
}

Итого

Null Safety в Dart — это мощный инструмент для написания надёжного кода. Правильное использование nullable/non-nullable типов предотвращает ошибки на этапе разработки.