我们是否应该始终在片段中取消检查Context?

问题描述 投票:1回答:3

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

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

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

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

这里的规则是什么?我们是否应该始终忽略我们的上下文?

android kotlin android-context
3个回答
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。通过这种方式,您将获得更少错误的代码,提供另一种处理nulls的方法。


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)
}

0
投票

很可能你会对这样的代码没问题

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

我相信你的MyActivity.createIntent()很有趣,你返回Intent

© www.soinside.com 2019 - 2024. All rights reserved.