Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 类型不匹配:推断的类型是FragmentActivity?但将支持库更新为27.0.0时需要上下文_Android_Kotlin - Fatal编程技术网

Android 类型不匹配:推断的类型是FragmentActivity?但将支持库更新为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!! 这似乎更好,因为如果它是空的,而它绝对不应该是空的,那么就有严重的错误,你应该崩溃 当然,

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

> 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()
方法。有一个冲突,你会得到一个编译错误。这样,当您重写生成的方法名时,就可以使其工作。只要不冲突,它可以是其他任何东西。