我的片段中有一个非常简单的点击侦听器:
button?.setOnClickListener {
val intent = Intent(MyActivity.createIntent(context!!)) // crash here because context is null
startActivity(intent)
}
Crashlytics显示,单击此特定按钮时,某些用户正在KotlinNullPointerException
崩溃。现在我知道问题正在发生,因为我正在强制展开Context。如果我只是将其包装在nullcheck中,它将不会崩溃。
但是我认为我的代码中存在一个更大的潜在问题,因为我总是在需要时强行打开上下文,而我只对这部分代码有问题。
这里的规则是什么?我们是否应该始终是否对上下文进行空检查?
答案 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的乐趣