繁体   English   中英

Kotlin Android Studio-在类型为Intent的可为空的接收器上仅允许安全(?。)或非null断言(!!。)调用。

[英]Kotlin Android Studio - Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Intent?

通过Android Studio 3.0开发要点时出现此错误代码。 “在Intent类型的可为空的接收器上只允许安全(?。)或非空声明(!!。)调用?”。 不知道为什么。 上面的代码是我目前正在使用的代码,“意图”已自动生成一个问号。 底部代码是本书中显示的内容。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if ((requestCode == request_code) && (resultCode == Activity.RESULT_OK)) {
        if (data.hasExtra("returnData")) {
            val returnString = data.extras.getString("returnData")
            textView1.text = returnString
        }
    }
}

书中的代码

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if ((requestCode == request_code) && (resultCode == RESULT_OK)) {
        if (data.hasExtra("returnData")) {
            val returnString = data.extras.getString("returnData")
            textView1.text = returnString
        }
    }
}

错误(如果您来自Swift),基本上是因为签名:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

指示类型为Intent?的参数data 类型为“ Nullable”(在Swift中为可选)。 意味着您必须先取消引用 Optional。

在Kotlin中(例如在Swift中),您使用? 标记。

if (data?.something)

表示如果数据为null或某项为false / null(取决于其类型),则if将不会进入其块。

相同于:

if (data?.something && data?.somethingElse)

如果数据为null,则不会崩溃,并且仅当somethingsomethingElse均为true时才通过条件(或对于非基本类型为non-null)。

该书可能引用的是Kotlin的旧版本或Kotlin-Android插件,其中收到的Intent 不是可选的 ,因此不能为null。

Kotlin可空性一章中,所有这些都可以得到更好的解释:)

您的intent为空,您必须使用?访问其属性? 或在使用它之前检查null:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (data != null && (requestCode == request_code) && (resultCode == Activity.RESULT_OK)) {
        if (data.hasExtra("returnData")) {
            val returnString = data.extras.getString("returnData")
            textView1.text = returnString
        }
    }
}

您可以利用智能投射,在这种情况下会自动投射Intent? 如果在使用data之前显式检查data != null ,则将其设置为Intent

否则,只需在需要的地方插入空安全方法调用,例如data?.hasExtra("returnData"))

这是因为自从您将data声明为可空值(也就是在Intent后面加上? )以来,您正在访问data变量的hasExtra而不检查data变量是否为非null,因此会出现该错误。 解决方案将是以下之一:

  1. 添加一个安全的运算符(?。)*(推荐): data.hasExtra(/* ... */) -> data?.hasExtra(/* ... */)
  2. 添加一个非data.hasExtra(/* ... */)算符( !! )*(除非您知道该值始终为非空,否则不建议这样做)*: data.hasExtra(/* ... */) -> data!!.hasExtra(/* ... */)
  3. 添加条件以在继续之前检查data是否为非空: data.hasExtra(/* ... */) -> data != null && data.hasExtra(/* ... */) (注意:Kotlin将对于data内部的代码,自动将data的值视为非空data != null条件)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM