Аннотация метаданных Dart без префикса @ atsign?

#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 раньше не было. Любые вызывающие устройства, не передающие вновь требуемый аргумент, больше не будут компилироваться. Вместо этого вы могли бы добавить значение по умолчанию или сделать тип аргумента обнуляемым.