Вызов может быть удобен для быстрого рефакторинга.

льку я обновил свой проект до версии 27 SDK и подключил плагины для библиотеки поддержки до версии27.0.0 Мне нужно было изменить мой код.

С участием26.1.0 Я могу просто использоватьgetContext() (с Котлинымcontext) в моемFragment (android.support.v4.app) и у меня нет проблем с nullability, но так как я использую 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 проверка была добавлена ​​иgetActivity метод даже окончательный, поэтому я не могу использовать свой обходной путь, что делает его очень и очень уродливым. На самом деле в исходных файлах методы выглядят одинаково, но26.1.0 имеет тип возврата KotlinContext! а также27.0.0 тип возвратаContext?.

 cutiko12 нояб. 2017 г., 17:32
Слегка связанный ... ненулевое значение означает, что фрагменты без интерфейса, но используемые как рабочие, не являются альтернативой сейчас?
 creativecreatorormaybenot12 нояб. 2017 г., 17:52
@cutiko Я не знаю, что ты имеешь в виду.

Ответы на вопрос(1)

Решение Вопроса

эти классы не имели аннотаций обнуляемости, поэтому из Kotlin все эти типы были простотипы платформ, В 27 они добавили необходимые аннотации, так что теперь эти типы определенно помечены как обнуляемые или не обнуляемые в Kotlin - нет необходимости догадываться, могут ли они бытьnull.

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

getActivity а такжеgetContext методы возвращают обнуляемые типы, потому что, когдаFragment не привязан кActivityэти методы уже вернулисьnull, В поведении нет никаких изменений, это просто явно отмечено, так что вы можете спокойно справиться с этим.inflater параметрonCreateView Этот метод был платформенным, так что вам решать, пометили ли вы его как обнуляемый или нет. Так как он никогда не будет вызван сnull, это было явно аннотировано как@NonNullтак что его тип в котлине сейчас строгоLayoutInflater вместо "слабее"LayoutInflater! тип.

Изменить: начиная с библиотеки поддержки 27.1.0, вы можете использоватьrequireActivity а такжеrequireContext методы, которые возвращают ненулевые типы, с оговоркой, что они бросятIllegalStateException когда обычные методы вернутсяnull.

 creativecreatorormaybenot12 нояб. 2017 г., 22:17
Спасибо за ответ. Это очень уродливо для Котлина, потому чтоgetContext() в моем случае никогда не будет нулевым, ниgetActivity(), Это означает, что мне сейчас нужно утверждать!! за ними за каждый звонок, что очень раздражает.
 android_dev14 апр. 2018 г., 00:19
начиная с 27.1.0 вы можете использовать методы requireContext () и requireActivity ()
 vovahost18 апр. 2018 г., 09:45
@Fhl вместо использованияcontext!! или жеcontext?.let{} вы можете использовать(context ?: return).
 Erik15 июн. 2018 г., 15:58
Совет: в некоторых случаях Android Studio «интуиция» (Alt + Enter) предлагает обернуть вcontext?.let { ... } или жеactivity?.let { ... } Вызов может быть удобен для быстрого рефакторинга.
 Fhl05 янв. 2018 г., 13:38
Обратите внимание, что если метод может быть вызван, когда активность / фрагмент равен нулю, вы можете обрабатывать его иначе, чем использовать нулевое утверждение!!, Другой подход заключается в использовании, например,activity?.let { /* Do something*/ }

Ваш ответ на вопрос