类型不匹配:推断类型是FragmentActivity?但是在将支持库更新到27.0.0时需要使用Context

时间:2017-10-31 11:46:24

标签: android kotlin

我已将Kotlin项目更新为使用支持库27.0.0。当我尝试在片段中获取活动上下文时,我收到此错误:

> Type mismatch: inferred type is FragmentActivity? but Context was expected

1 个答案:

答案 0 :(得分:14)

可以安全地假设activitycontext在任何片段的生命周期方法中都不为空(在onAttachonDetach)之间。在这种情况下

context!!

似乎更好,因为如果它肯定是 NOT 应该是null,那么它就是null,这是非常错误的,你应该崩溃。

在异步回调当然检查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.
    }
}

无处不在的空检查与非空的断言运算符一样糟糕。

这等于在添加了可空性注释的支持库27之前会发生的情况。您可以在任何地方访问context,如果它为空并且已取消引用,则会崩溃。

更新:最近的支持库为此案例介绍了方法:

  • requireActivity():活动
  • requireContext():Context
  • requireHost():Object
  • requireFragmentManager():FragmentManager

与我上面的建议不同的是,这些方法会抛出IllegalStateException而不是KotlinNullPointerException