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

时间:2019-07-01 16:20:05

标签: android kotlin

在通过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
        }
    }
}

4 个答案:

答案 0 :(得分:1)

如果您来自Swift,则该错误基本上是由于签名:

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

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

在Kotlin中(就像在Swift中一样),您可以使用?标记。

if (data?.something)

表示如果数据为空,或者某些数据为假/空(取决于其类型),则if将 not 进入其块。

相同于:

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

如果数据为null,则不会崩溃,并且仅在somethingsomethingElse均为true时(或对于非基本变量为非null)通过条件。

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

Kotlin Nullability一章中可以更好地解释所有这些内容:)

答案 1 :(得分:0)

您的intent可为空,您必须使用?访问其属性,或者在使用前检查是否为空:

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
        }
    }
}

答案 2 :(得分:0)

您可以利用智能投射,如果在使用Intent?之前明确检查了Intent,这种情况下会自动将data != null投射为data

否则,只需在需要的地方插入像data?.hasExtra("returnData"))这样的空安全方法调用即可。

答案 3 :(得分:0)

这是因为您正在访问hasExtra变量上的data而没有检查data变量是否为非空,因为您已声明data为可空(又将?附加到Intent上),因此会出现该错误。解决方案将是以下之一:

  1. 添加安全操作员(?。)*(推荐):data.hasExtra(/* ... */)-> data?.hasExtra(/* ... */)
  2. 添加非空运算符(!!)*(不推荐使用,除非您知道该值总是 为非空)*:data.hasExtra(/* ... */)-> { {1}}
  3. 添加条件以检查data!!.hasExtra(/* ... */)是否为空,然后继续:data-> data.hasExtra(/* ... */)(注意:Kotlin将自动将data != null && data.hasExtra(/* ... */)的值视为data条件内的代码为非null)