我的片段中有一个非常简单的点击监听器:
button?.setOnClickListener {
val intent = Intent(MyActivity.createIntent(context!!)) // crash here because context is null
startActivity(intent)
}
Crashlytics显示,某些用户在点击此特定按钮时会遇到KotlinNullPointerException
崩溃。现在我知道问题正在发生,因为我强行打开了Context。如果我只是将它包装在nullcheck中,它就不会崩溃。
但我认为我的代码中存在更大的底层问题,因为我总是在需要时强制解包上下文,而我只对这段特定的代码有问题。
这里的规则是什么?我们是否应该始终忽略我们的上下文?
如果你看一下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的方法。
点击内部按钮,您可以轻松使用: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)
}
很可能你会对这样的代码没问题
button?.setOnClickListener {startActivity(MyActivity.createIntent(it.context))}
我相信你的MyActivity.createIntent()很有趣,你返回Intent