我们是否应该始终对片段内的上下文进行空检查?

Should we always nullcheck Context inside a fragment?

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

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

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

但我认为我的代码中存在更大的潜在问题,因为我总是在需要时强制解包上下文,而我只对这段特定的代码有问题。

这里的规则是什么?我们是否应该总是 nullcheck 我们的上下文?

单击按钮内部您可以轻松使用: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() 有趣你 return 意图

如果您查看 fragment.getContext() 方法的源代码,您会看到:

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

也就是说getContext可以returnnull。在内部 mHost 表示附加了一个 Activity 片段。片段并不总是附加到它的托管 activity,您可以使用 onAttach / onDetach 生命周期回调来观察这一点。

对于您的情况,如前所述,最好的方法是使用来自 View

的上下文
view.setOnClickListener { it.context }

但总的来说,始终检查可为空的内容,并且不要执行 !!,即使您确定它不是 null。通过这种方式,您的代码将不易出错,从而提供另一种处理 nulls.

的方法