Поскольку я обновил свой проект до версии SDK версии 27 и плагины градиента для библиотеки поддержки до версии 27.0.0
мне нужно было изменить свой код.
С 26.1.0
я могу просто использовать getContext()
(с context
Kotlin) в своем Fragment
( android.support.v4.app
), и у меня нет проблем с ошибкой, но поскольку я использую Kotlin, у меня проблема с версией 27.0.0
, все мои context
вызовы больше не работали, мне нужен был оператор безопасности, например context!!
, но поскольку я лично считаю, что это суета, чтобы делать это каждый раз, когда я только что сделал себя, я обходной функции
override fun getContext() = super.getContext()!!
Другое изменение (внезапно и именно поэтому я спрашиваю) – это методы onCreateView()
и onViewCreated()
. В onCreateView
инфлятор больше не может быть нулевым, поэтому мне нужно было изменить свою подпись функции для правильного переопределения из onCreateView(inflater: LayoutInflater?...)
в onCreateView(inflater: LayoutInflater...)
и то же самое для параметра createdView
в onViewCreated
.
Так что теперь мне стало интересно, почему, особенно (для Kotlin) очень уродливое getContext()
было внесено изменение и отправлено на https://developer.android.com/sdk/support_api_diff/27.0.0/changes.html .
Но подождите, видимо, они не изменили его? Итак, теперь мой вопрос в том, что я делаю что-то неправильно или если они действительно изменили его, и если да, то я могу спросить их, почему?
Кстати, то же самое относится к getActivity()
, я думаю, что mHost == null
check был добавлен, и метод getActivity
даже окончательный, поэтому я не могу использовать мой обходной путь там, что делает его очень уродливым. На самом деле в исходных файлах методы выглядят одинаково, но 26.1.0
имеет Kotlin return type Context!
и 27.0.0
возвращаемый тип Context?
,
Это были преднамеренные изменения. Перед этой версией библиотеки поддержки эти классы не имели аннотаций с нулевым значением, поэтому из Котлина все эти типы были только типами платформ . В 27 они добавили необходимые аннотации, так что теперь эти типы определенно отмечены как NULL или NULL-значения в Kotlin – нет необходимости угадывать, могут ли они быть null
.
Что касается конкретных методов, о которых вы упомянули:
getActivity
и getContext
возвращают типы с getActivity
значением, потому что, когда Fragment
не привязан к Activity
, эти методы уже возвратили null
. Изменений в поведении нет, теперь он явно отмечен, поэтому вы можете спокойно справиться с этим. onCreateView
метода onCreateView
использовался как тип платформы, поэтому вам было необходимо, чтобы вы отметили его как nullable или нет. Поскольку он никогда не будет вызываться с null
, он был явно аннотирован как @NonNull
, поэтому его тип в Kotlin теперь является строго LayoutInflater
а не «более LayoutInflater!
» LayoutInflater!
тип.