代码之家  ›  专栏  ›  技术社区  ›  Lukas Bimba

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

  •  0
  • Lukas Bimba  · 技术社区  · 5 年前

    我在阅读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 回复  |  直到 5 年前
        1
  •  1
  •   Martin Marconcini    5 年前

    如果您来自Swift,错误主要是因为签名:

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

    指示参数 data 类型 Intent? 类型为“Nullable”(在swift中是可选的)。意味着你必须 取消引用 第一个选项。

    在科特林(就像在斯威夫特),你用 ? 作记号。

    if (data?.something)
    

    意味着如果数据为空,或者某个值为假/空(取决于其类型),那么if将 输入其块。

    同样适用于:

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

    如果数据为空,则不会崩溃,并且仅当两者都为空时才传递条件 something somethingElse 为真(非基元为非空)。

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

    所有这些在 Kotlin Nullability 章节:)

        2
  •  0
  •   Francesc    5 年前

    你的 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
            }
        }
    }
    
        3
  •  0
  •   sschrass Maverick    5 年前

    你可以利用智能投射,在这种情况下自动投射 Intent? Intent 如果你明确检查 data != null 使用前 data .

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

        4
  •  0
  •   Edric Prince Bansal    5 年前

    这是因为你正在访问 hasExtra data 变量,不检查 数据 自您声明以来,变量为非空 数据 可以为空(即 ? 附加到 Intent ,因此您会得到这个错误。解决方案如下:

    1. 添加安全操作员(?.)*(推荐): data.hasExtra(/* ... */) -gt; data?.hasExtra(/* ... */) )
    2. 添加非空运算符( !! )*(除非您知道该值将 总是 非空)*: data.hasExtra(/*…*/) -gt; data!!.hasExtra(/* ... */)
    3. 添加条件以检查 数据 在继续之前为非空: data.hasExtra(/*…*/) -gt; data != null && data.hasExtra(/* ... */) (注:Kotlin将自动处理 数据 对于 data != null 条件)