Должны ли мы всегда проверять контекст внутри фрагмента? - PullRequest
0 голосов
/ 04 марта 2019

В моем фрагменте очень простое прослушиватель щелчков:

button?.setOnClickListener {
    val intent = Intent(MyActivity.createIntent(context!!)) // crash here because context is null
    startActivity(intent)
}

Crashlytics показывает, что некоторые пользователи получают KotlinNullPointerException сбоев при нажатии на эту конкретную кнопку.Теперь я знаю, что проблема происходит, потому что я принудительно разворачиваю Контекст.Если бы я просто обернул его внутри нулевой проверки, это не привело бы к сбою.

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

Какое здесь правило?Должны ли мы всегда проверять NULL наш контекст или нет?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Скорее всего, у вас все будет в порядке с кодом, подобным этому

button?.setOnClickListener {startActivity(MyActivity.createIntent(it.context))}

Я верю в ваше удовольствие от MyActivity.createIntent (), когда вы возвращаете Intent

0 голосов
/ 04 марта 2019

Если вы посмотрите на исходный код метода fragment.getContext(), вы увидите:

@Nullable
public Context getContext() {
    return mHost == null ? null : mHost.getContext();
}

Что означает, что getContext может вернуть null.Внутренне mHost представляет собой фрагмент Activity, к которому прикреплен.Фрагмент не всегда привязан к активности хостинга, вы можете наблюдать это, используя onAttach / onDetach обратные вызовы жизненного цикла.

В вашем случае, как уже упоминалось, лучшим подходом будет использование контекста из View

view.setOnClickListener { it.context }

Но в общем, всегда проверяйте обнуляемые вещи и не делайте !!, даже если вы уверены, что это не null.Таким образом у вас будет меньше подверженного ошибкам кода, предоставляя альтернативный способ обработки null s.

0 голосов
/ 04 марта 2019

Внутри нажатия кнопки вы можете легко использовать: view.getContext(), чтобы получить контекст или в Kotlin

it.context // which will be never null 

, т. Е.

button?.setOnClickListener {
   val intent = Intent(MyActivity.createIntent(it.context)) // this wont ever crash
   startActivity(intent)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...