我们是否应该始终对片段内的Context进行nullcheck?

时间:2019-03-04 10:04:54

标签: android kotlin android-context

我的片段中有一个非常简单的点击侦听器:

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

Crashlytics显示,单击此特定按钮时,某些用户正在KotlinNullPointerException崩溃。现在我知道问题正在发生,因为我正在强制展开Context。如果我只是将其包装在nullcheck中,它将不会崩溃。

但是我认为我的代码中存在一个更大的潜在问题,因为我总是在需要时强行打开上下文,而我只对这部分代码有问题。

这里的规则是什么?我们是否应该始终是否对上下文进行空检查?

3 个答案:

答案 0 :(得分:3)

如果您查看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的替代方法。

答案 1 :(得分:1)

单击内部按钮,您可以轻松使用: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)
}

答案 2 :(得分:0)

最可能的是,您会满意这样的代码

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

我相信您可以通过MyActivity.createIntent()返回Intent的乐趣