Ответ
Это термин, введённый Тони Хоаром, для обозначения введения концепции null в языки программирования. В контексте Dart и Flutter это приводит к ошибкам времени выполнения, когда код пытается вызвать метод или обратиться к свойству у null-значения (например, NoSuchMethodError).
С введением null safety (Dart 2.12+) система типов помогает предотвратить эти ошибки на этапе компиляции. Переменные по умолчанию не могут быть null, если явно не помечены как nullable с помощью ?.
Пример и безопасная работа с nullable-типами:
String? nullableName; // Может быть String или null
String regularName = 'Flutter'; // Не может быть null
// Опасный вызов — может вызвать ошибку во время выполнения, если nullableName == null
// print(nullableName.length);
// Безопасные подходы:
// 1. Проверка на null (flow analysis)
if (nullableName != null) {
print(nullableName.length); // В этой области видимости тип — String
}
// 2. Оператор безопасного вызова `?.`
print(nullableName?.length); // Выполнит length, если не null, иначе вернёт null
// 3. Оператор объединения `??` для предоставления значения по умолчанию
print(nullableName?.length ?? 0); // Если null, то использует 0
// 4. Оператор утверждения `!` (используйте с осторожностью, только если уверены)
print(nullableName!.length); // Говорит компилятору: "это не null". Выбросит ошибку, если окажется null.
Основная практика — максимально использовать не-nullable типы и явно обрабатывать nullable случаи через ?, ?? и условные проверки, чтобы ошибки на миллион долларов оставались в прошлом.