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

Ivo*_*nov 10 android kotlin

我已经更新了我的Kotlin项目以使用支持库27.0.0.当我尝试在片段中获取Activity上下文时,我收到此错误:

> Type mismatch: inferred type is FragmentActivity? but Context was expected
Run Code Online (Sandbox Code Playgroud)

Eug*_*nec 17

它是安全的假设,activitycontext不为空,在任何片段的生命周期方法(之间onAttachonDetach).在这种情况下,

context!!
Run Code Online (Sandbox Code Playgroud)

看起来更好,因为如果它肯定不是 null,那么它就是null,这是非常错误的,你应该崩溃.

在异步回调当然检查null.

为了我 "!!" 绝不是选择.

然后一定要把它抽象出去.这就是我在BaseFragment课堂上所做的:

val context: Context
    @JvmName("getContext2") 
    get() = getContext()!!
Run Code Online (Sandbox Code Playgroud)

然后在使用网站:

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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