#flutter #dart #annotations #metadata
#флаттер #dart #аннотации #метаданные
Вопрос:
Согласно документации Dart:
Аннотация метаданных начинается с символа
@
, за которым следует либо ссылка на константу времени компиляции (например,deprecated
), либо вызов конструктора константы.
Тем не менее, рассмотрим следующий отрывок из исходного кода Flutter:
@protected
void handleTapDown({ required PointerDownEvent down });
// ^^^^^^^^
Если это аннотация метаданных, то почему она не начинается @
со знака с префиксом? Если это не так, то что это ?!
Комментарии:
1. Новое ключевое слово, которое вводится в рамках предстоящей функции безопасности null: dart.dev/null-safety/…
Ответ №1:
Раньше (до Dart 2.12 — нулевая безопасность) текущим required
ключевым словом была @required
аннотация метаданных.
Если это аннотация метаданных, то почему она не начинается с префикса @ sign ? Если это не так, то что это ?!
required
это не аннотация метаданных, это ключевое слово Dart, что означает, что это одно из слов, которые Dart обрабатывает специально.
Итак, в чем разница? Цитирование из документации Dart, часто задаваемые вопросы по безопасности Null:
В
@required
аннотации отмечены именованные аргументы, которые должны быть переданы; если нет, анализатор сообщает подсказку.При нулевой безопасности именованный аргумент с ненулевым типом должен либо иметь значение по умолчанию, либо быть помечен
required
ключевым словом new . В противном случае не имело бы смысла, чтобы оно не обнулялось, потому что по умолчанию оно будет равно null, если не будет передано.Когда из устаревшего кода вызывается код, защищенный от нуля
required
, ключевое слово обрабатывается точно так же, как@required
аннотация: отказ предоставить аргумент вызовет подсказку анализатора.Когда нулевой безопасный код вызывается из нулевого безопасного кода, невозможность указать требуемый аргумент является ошибкой.
Что это означает для миграции? Будьте осторожны при добавлении
required
там, где@required
раньше не было. Любые вызывающие устройства, не передающие вновь требуемый аргумент, больше не будут компилироваться. Вместо этого вы могли бы добавить значение по умолчанию или сделать тип аргумента обнуляемым.