Android support annotation nullable

Support Annotations — аннотации для кода

Начиная с версии 19.1 библиотека Android support library включает себя аннотации, которые помогают улучшить код, уменьшая количество ошибок. Кстати, сама библиотека и многие другие классы системы уже используют новые аннотации в своём коде и вы их можете иногда видеть при наборе своего текста. Количество аннотаций увеличивается, поэтому сверяйтесь с документацией.

По умолчанию аннотации не включены, они идут как отдельная библиотека. Но она входит в состав библиотеки appcompat. Если вы не используете appcompat, то подключите библиотеку аннотаций самостоятельно.

Так как на сегодняшний день проекты по умолчанию используют appcompat, то будем считать, что аннотации всегда готовы к употреблению.

Подсказки с аннотацией появляются при попытке ввести неверный тип параметра в методе, который предусмотрительно снабжён аннотацией.

Аннотации для ресурсов

Для первого знакомства приведу пример с использованием ресурсов. В коде мы часто используем ресурсы строк, изображений, идентификаторов и т.п. По сути ресурс в данном случае является числом типа int. Подготовим ресурсы для имён котов в res/strings.xml

Напишем вспомогательный метод для генерации имени кота, используя строковый ресурс.

Студия не замечает ошибок, метод написан правильно и даже работает.

Но никто вам не помешает написать и такие варианты:

Два варианта используют корректные типы, но результат будет не тот, который мы хотели увидеть. В первом случае выведется путь к ресурсу (к счастью, программа продолжит работу), а во втором произойдёт ужасное — программа пойдёт к коту под хвост.

Как избежать этих ошибок, перепишем метод с добавлением аннотации:

Теперь студия будет подчёркивать неправильные параметры 451 или R.mipmap.ic_launcher и выводить предупреждение, что она ожидает строковые ресурсы, а не любые выдуманные вами числа.

Вы можете использовать аннотации @AnimatorRes, @AnimRes, @AnyRes, @ArrayRes, @AttrRes, @BoolRes, @ColorRes, @DimenRes, @DrawableRes, @FractionRes, @IdRes, @IntegerRes, @InterpolatorRes, @LayoutRes, @MenuRes, @PluralsRes, @RawRes, @StringRes, @StyleableRes, @StyleRes, @XmlRes и т.д. Если у вас есть свой тип ресурсов «foo», то можете использовать аннотацию FooRes.

@NONNULL/@NULLABLE

Поняв базовый принцип, вы теперь можете использовать и другие аннотации. Например, указать, что параметр не может быть null или, наоборот, может принимать значение null.

Студия выводит предупреждение, но позволит запустить программу. Нажатие на кнопку и опять ваш труд коту под хвост — крах приложения.

@CheckResult — ожидание результата

Метод может возвращать какое-то значение, которое нужно применить. А можно просто вызвать метод, только какой в этом смысл, если возвращаемое значение нигде не используется? Для тех, кто страдает склерозом — встречайте аннотацию @CheckResult.

Студия укажет на ошибку и откажется запускать ваше приложение. Умница.

Читайте также:  Проектор touyinger full hd rd826 android version

Аннотация для продвинутых. ProGuard удаляет неиспользуемые методы при компиляции. Если она делает это ошибочно или по каким-то другим причинам вам нужно оставить метод в приложении, то используйте @Keep:

Аннотации для потоков

Существуют специальные аннотации для указания потоков.

Например, мы знаем, что методы класса AsyncTask могут работать только в определённых потоках.

Если в методе doInBackground() обратиться к какому-нибудь компоненту, то студия предупредит, что так делать нельзя.

@UiThread и @MainThread практически совпадают, но в редких случаях могут различаться. Подробности в документации.

Аннотация для цвета

Вы можете задать цвет через ресурс, используя аннотацию @ColorRes. А если перед вами стоит противоположная задача — указать значение цвета через RGB/ARGB, то используйте аннотацию @ColorInt. В этом случае при использовании цветового ресурса студия покажет ошибку.

Диапазон значений

Можно указать диапазон значений для типов float/double через аннотацию @FloatRange:

В этом случае можно использовать значения от 0.0 до 1.0. Любая попытка ввести другое значение приведёт к предупреждению.

Аналогично работает для типов int/long через аннотацию @IntRange:

Для массивов, коллекций и строк можно использовать аннотацию @Size для установки ограничений в размерах или длине строк.

  • Если коллекция не должна быть пустой — @Size(min=1)
  • Максимальная длина строки 15 символов — @Size(max=15)
  • Массив точно состоит из двух элементов — @Size(2)
  • Длина массива должна быть кратна двум (например, координаты точек X и Y) — @Size(multiple=2)

Аннотации для разрешений

Если ваш метод использует функциональность, которая доступна через разрешения, то можете указать через аннотацию @RequiresPermission:

Если имеются несколько подходящих разрешений, то можно использовать атрибут anyOf, чтобы выбрать один из них:

А если нужно выбрать несколько разрешений, то используйте атрибут allOf:

Разрешения для намерений

Если есть разрешения на чтение или запись, то можно указать нужный режим через аннотации @Read или @Write:

Суперкласс

Если метод должен использовать вызов суперкласса, то используем аннотацию @CallSuper:

Остальные аннотации

В документации вы можете узнать о других аннотациях: IntDef/StringDef, @VisibleForTesting и т.д.

Источник

Build Error: package android.support.annotation does not exist import android.support.annotation.Nullable #567

Comments

roshan-p commented Jun 19, 2019

I get this Erros after Android X migration, Please help
Package.json
«react-native»: «0.57.0»,
«react-native-fbsdk»: «^0.10.0»,

The text was updated successfully, but these errors were encountered:

redcancode commented Jun 19, 2019

this is a very interesting issue. i think it shouldn’t be happening. your error log mentions this file /node_modules/react-native-fbsdk/android/src/main/java/com/facebook/reactnative/androidsdk/FBLikeViewManager.java which doesn’t exist in 0.10.0, you can check it in the repo. are you sure you’ve pulled in the correct version of this library?

roshan-p commented Jun 19, 2019 •

@redcancode OK So I have tried delete node_modules re-install and build app again I still get the same errors but not with «FBLikeViewManager.java» anymore.

duarte-evocorp commented Jun 20, 2019

Has anyone been able to solve the problem?

janicduplessis commented Jun 20, 2019

Try version 1.0.0-rc.3 it should be compatible with androidx

tokinonagare commented Jun 20, 2019

try to use androidx

roshan-p commented Jun 20, 2019

Try version 1.0.0-rc.3 it should be compatible with androidx

Thanks It’s work! 🙂

ronakjain-2 commented Jun 21, 2019 •

Try version 1.0.0-rc.3 it should be compatible with androidx

can you please tell us. which module of 1.0.0-rc.3 version we need to use and where to use it either in build.gradle or in package.json.

Читайте также:  Android tablet with ios

I am also getting the same issue when doing change
Upgrade com.android.tools.build:gradle to v3.2.1.
Upgrade compileSdkVersion to 28.
Update your app to use Jetpack (AndroidX)

rkbansal commented Jun 24, 2019

@ronakjain-2 , it will be react-native-fbsdk
«react-native-fbsdk»: «1.0.0-rc.3»

praveens96 commented Jul 11, 2019

1.0.0-rc.3 solves this issue but receiving issue saying:
error: constructor FBSDKPackage in class FBSDKPackage cannot be applied to given types; new FBSDKPackage()

NestedLooper commented Jul 16, 2019 •

@praveens96 it needs to be
new FBSDKPackage(mCallbackManager)
If you have an additional new FBSDKPackage() without the callback manager being passed then remove it.

Источник

импорт NotNull или Nullable и Android Studio не будут компилироваться

когда я добавляю @NotNull или @ nullable аннотации к параметру Android Studio автоматически помогает мне с добавлением/lib / аннотаций.jar и импорта

но после этого проект не компилируется. Если я также удалю аннотации, но сохраню операторы импорта, проект все равно не будет компилироваться. но если я удаляю операторы импорта для NotNull и Nullable, проект компилируется штраф в размере!

Android Studio дает общий ошибка:

под управлением gradlew compileDebug из cmd дает небольшой намек:

поэтому я проверил переменные среды, и они установлены как:

у кого-нибудь есть идеи для этого? (Я новичок в программировании на java и android)

7 ответов

Я думаю, правильный способ-использовать оригинальную библиотеку JetBrains из репозитория MavenCentral в вашей сборке.зависимости gradle (последняя доступная версия в этом примере):

вы также можете использовать собственный android @NonNull & @Nullable :

добавить построить.Gradle в:

на / заданиеНастройки Проектаинспекции и поиск «nullable».

на постоянные условия и исключения и @NotNull / @Nullable проблемы, нажмите кнопку настроить Примечания и выберите аннотации Android.

вы также можете проверить предложить @ nullable аннотации. под постоянные условия и исключения, или, возможно, настроить другие параметры.

для использования анотации поддержки андроида как — @Nullable, @NonNull etc.. В ваш проект необходимо импортировать библиотеку аннотаций поддержки android. Просто добавьте эту строку в dependensies в файле gradle

и импортировать пакет в класс.
для использования @nullable аннотация:

больше информации вы можете найти здесь разработчики Android

на данный момент в API Android или в библиотеке поддержки нет аннотаций NonNull/Nullable. Вы также не можете использовать IntelliJ, так как они не находятся в пути к классам компиляции при построении с помощью Gradle.

тем не менее, вы можете легко создать свой собственный. Это очень просто:

после этого вы можете настроить IntelliJ (или Android Studio), чтобы распознать этот (и соответствующий @Nullable ) быть аннотацией по умолчанию, используемой для Нулевые проверки.

для этого перейдите в настройки IntelliJ в разделе Inpections , а затем найти @NotNull/@Nullable problems вход под Probable Bugs в дереве инспекции.

выберите пункт и в правом нижнем углу у вас будет кнопка «настроить аннотации». Это позволит вам установить свои собственные аннотации в качестве одного intelliJ будет использовать для этой проверки.

самый простой способ добавить следующее в раздел зависимостей вашей сборки.файл gradle.

EDIT: обновлено для использования идеи @RichieHH для использования репозитория maven, что, безусловно, является способом сделать это.

в настоящее время, вы должны использовать аннотации android.поддержка.аннотация. Я просто не уверен, когда они добавили их в docs нет типичного предложения «добавлено на уровне API X», и мне не хочется читать блоги и т. д. >]

Читайте также:  Настройка windscribe для android

лучший способ-использовать зависимость maven

Источник

Каковы правильные применения @NonNull и @Nullable?

Я запутался в правильном использовании этих аннотаций.

Информация в документации для @NonNull говорит:

Обозначает, что возвращаемое значение параметра, поля или метода никогда не может быть нулевым.

Что это означает в случае параметров, когда нет ничего, чтобы остановить передачу null ?

Например, предположим, что у меня есть класс MyObject и что экземпляр может иметь или не иметь заголовок.

Здесь я использую null для представления отсутствия заголовка, но это детализация реализации, поэтому мне не нужен ни один метод установки и очистки заголовка.

Если я @Nullable title поля как @Nullable , студия Android сообщает мне, что параметр setTitle должен быть также отмечен как @Nullable (но это противоположность тому, что я хочу).

Если я setTitle методу setTitle как @NonNull я получаю предупреждение о том, что title == null состояния title == null всегда является false .

Какое правильное использование этих аннотаций в таком случае? Если @NonNull означает, что параметр никогда не может быть null неправильно ли использовать его для обозначения не должно быть null ? Если да, есть ли правильный способ указать это?

Дело в том, что эта аннотация – это своего рода контракт, поэтому вам не нужно делать проверки, если вы правильно аннулируете свои методы. Android Studio проверяет, что вы не с этим связываетесь. Вы все равно можете игнорировать его, но это приведет к предупреждению компилятора.

Если вы опустите эту бесполезную (по контракту) проверку безопасности, она будет правильно перебрасывать nullpointer-excceptions. Но разработчик был предупрежден с вашей аннотацией.

@Nonnull и @Nullable являются декларативными. Это подсказка для разработчиков программного обеспечения. Вы говорите им, что параметр может быть нулевым значением, или он не должен.

Если вы отметите параметр аннотацией @Nonnull , вы сообщите каждому человеку, использующему ваш API, что они не должны передавать здесь нулевое значение, иначе они должны иметь дело с последствиями (например, NullPointerException ).

Вы можете использовать его для объявления, параметр ДОЛЖЕН быть недействительным, это, по-моему, действительный прецедент.

Идем дальше и помечаем параметр методу @NonNull как @NonNull .

Это гарантирует, что компилятор выдает ошибку, когда какой-то код вызывает setTitle со значением, которое может быть нулевым . Поэтому компилятор гарантирует, что setTitle никогда не вызывается с null . Поэтому вы можете удалить null проверку в вашем методе, в результате чего заголовок «title == null всегда остается ложным».

Т.е. ваш код будет выглядеть так:

(Примечание: я не использую Android Studio, но я думаю, что он ведет себя аналогично Eclipse. В Eclipse я получаю ошибку Null type mismatch: required ‘@NonNull String’ but the provided value is null(/inferred as @Nullable) при попытке Передать null или выражения, которые могут иметь значение null для setTitle.)

BTW: также аннотирование определения title поля с помощью @Nullable сделает его более явным title также может содержать null значения.

Если вы помечаете аргумент @NonNull, то пользователь вашего метода должен выполнить нулевую проверку, так как @NonNull не будет захватывать NPE во время выполнения. Так, например, если у вас был класс утилиты со вспомогательными методами, которые проверяют значение null перед выполнением, то вы должны пометить эти аргументы как @Nullable, так как вы технически можете передать нулевое значение, но безопасно проверяете его.

Источник

Оцените статью