Android 类型不匹配:推断的类型是FragmentActivity?但将支持库更新为27.0.0时需要上下文
我已将Kotlin项目更新为使用支持库27.0.0。当我尝试在片段中获取活动上下文时,我遇到以下错误:Android 类型不匹配:推断的类型是FragmentActivity?但将支持库更新为27.0.0时需要上下文,android,kotlin,Android,Kotlin,我已将Kotlin项目更新为使用支持库27.0.0。当我尝试在片段中获取活动上下文时,我遇到以下错误: > Type mismatch: inferred type is FragmentActivity? but Context was expected 可以安全地假设活动或上下文在片段的任何生命周期方法中都不为空(介于onAttach和onDetach之间)。在这种情况下 context!! 这似乎更好,因为如果它是空的,而它绝对不应该是空的,那么就有严重的错误,你应该崩溃 当然,
> Type mismatch: inferred type is FragmentActivity? but Context was expected
可以安全地假设
活动
或上下文
在片段的任何生命周期方法中都不为空(介于onAttach
和onDetach之间)
。在这种情况下
context!!
这似乎更好,因为如果它是空的,而它绝对不应该是空的,那么就有严重的错误,你应该崩溃
当然,在异步回调中检查null
对我来说,“!!”永远是一种选择
然后想尽一切办法把它抽出来。这就是我在BaseFragment
类中所做的:
val context: Context
@JvmName("getContext2")
get() = getContext()!!
然后在使用现场:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
context // Context is *never* null here.
}
fun someCallbackMethod() {
if (isAdded) {
context // Context is also not null here.
} else {
// But it is null here.
}
}
到处都是毫无根据的空检查,与非空断言运算符一样糟糕
这与添加了可空性注释的SupportLibrary 27之前的情况相同。您可以在任何地方访问上下文
,如果该上下文为null并被取消引用,它将崩溃
更新:最近的支持库为这种情况引入了一些方法:
- 反应性():活动
- requireContext():上下文
- requireHost():对象
- requireRefragmentManager():碎片管理器
与我上面的建议不同的是,这些方法将抛出
IllegalStateException
,而不是KotlinNullPointerException
这行@JvmName(“getContext2”)中为什么会出现getContext2的可能重复?@anivaler问得好val context
将被编译为getContext()
方法,但已经存在原始的getContext()
方法。有一个冲突,你会得到一个编译错误。这样,当您重写生成的方法名时,就可以使其工作。只要不冲突,它可以是其他任何东西。