Что такое null safety в Dart
Что проверяют
Понимаете ли вы, что null safety в Dart это не набор операторов, а гарантия на этапе компиляции. Для фронтенда вопрос прикладной: вокруг вас необязательные поля из API, необязательные параметры компонентов и состояние, которого пока нет.
Как отвечать
В современном Dart запрет на null это поведение по умолчанию, а не режим, который включают: тип String значение null принять не может, для этого пишут String?. Проверка статическая, поэтому компилятор знает, где обращение безопасно, и убирает лишние проверки, а не добавляет их в исполняемый код.
Инструменты: ?. для безопасного вызова, ?? и ??= для значения по умолчанию, ...? для необязательного раскрытия коллекции, late для поля, которое инициализируется позже объявления, required для обязательного именованного параметра. Отдельно упомяните продвижение типа: после явной проверки локальная переменная внутри блока уже считается непустой.
final String? name = user.name;
if (name != null) {
print(name.length);
}
final title = name ?? 'без имени';Сильный ответ отметит разницу между списком, которого может не быть, и списком, где пустым бывает элемент, а также то, что допустимость null это часть публичного контракта: ослабить тип легко, вернуть обратно ломающее изменение.
Где спотыкаются
Считают ! безопасным способом. Это утверждение разработчика, а не проверка: если значение всё же пустое, приложение падает при исполнении ровно там, где компилятор предупреждал. В интерфейсе уместнее подставить значение по умолчанию или отрисовать пустое состояние.
Ждут продвижения типа от поля класса или от свойства компонента. Компилятор не поручится, что между проверкой и использованием геттер вернёт то же самое, поэтому значение сначала кладут в локальную переменную и проверяют уже её.
Помечают late каждое неудобное поле. Это лишь переносит ошибку из сборки в исполнение: обращение до инициализации даёт исключение у пользователя вместо подчёркнутой строки у разработчика.