【问题标题】:Error "Required:String Found:String?" Kotlin and Android Studio错误“必需:找到的字符串:字符串?” Kotlin 和 Android Studio
【发布时间】:2019-01-22 15:32:12
【问题描述】:

正如标题所示,我在“var myNote = Note(id, title, note, ServerValue.TIMESTAMP)”行的“id”下得到了一个红色下划线 错误“必需:找到的字符串:字符串?” Kotlin 和 Android Studio

class MainActivity : AppCompatActivity() {
    var mRef:DatabaseReference? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val database = FirebaseDatabase.getInstance()
        mRef = database.getReference("Notes")

        add_new_note.setOnClickListener {
            showDialogAddNote()
        }
    }

    fun showDialogAddNote() {
        val alertBuilder = AlertDialog.Builder(this)

        val view = layoutInflater.inflate(R.layout.add_note, null)

        alertBuilder.setView(view)

        val alertDialog = alertBuilder.create()
        alertDialog.show()

        view.btnSaveNote.setOnClickListener {
            val title = view.etTitle.text.toString()
            val note = view.etNote.text.toString()

            if (title.isNotEmpty() && note.isNotEmpty()) {
                var id = mRef!!.push().key

                var myNote = Note(id, title, note, ServerValue.TIMESTAMP)
                mRef!!.child(id).setValue(myNote)
                alertDialog.dismiss()    
            } else {
                Toast.makeText(this, "Empty", Toast.LENGTH_LONG).show()
            }
        }
    }
}

这是我的 Notes.kt 课程

package com.example.gearoidodonovan.books

import java.util.*

class Note (var id:String, var title:String, var note:String, var timestamp: MutableMap<String, String>) {
}

【问题讨论】:

  • 您的问题在概念上等同于:stackoverflow.com/questions/36465626/…
  • lateinit var mRef:DatabaseReference 有助于避免! mRef 周围。 mRef!!.push().key 可以为空。是否可能由您的数据库决定。最安全的方法是添加对 null 的检查,例如 if 语句或使用 Elvis 运算符 ?: 在左侧为 null 时传递表达式

标签: java android kotlin


【解决方案1】:

Kotlin 迫使您对可空性保持高度清醒。

您的Note 实体说它需要一个不可为空的id:String,显然,mRef!!.push().key 返回一个String?,这意味着它是一个可以为空的字符串。你可以通过双击来解决这个问题,即mReff!!.push().key!!

另一个提示是ALT+ENTER 这些与 Kotlin 相关的错误,它会为您提供双重提示。

【讨论】:

  • 非常感谢!!
【解决方案2】:

Note 中的 id 属性声明为非空 String,而您拥有的密钥可能是空 String?。你需要弥合这个差距。

  1. 最简单但最危险的方法是使用!!,如果key为空,则会产生异常,即

    var id = mRef!!.push().key!!
    
  2. 更好的方法是以某种方式处理 null 情况,例如通过执行 null 检查:

    var id = mRef!!.push().key
    if (id != null) {
        var myNote = Note(id, title, note, ServerValue.TIMESTAMP)
        mRef!!.child(id).setValue(myNote)
        alertDialog.dismiss()
    } else {
        // handle the case where key is null somehow
    }
    
  3. 您还可以使您自己的类中的属性可以为空,并处理其中的 ID 值以后可能为空:

    class Note (var id: String?, var title: String, var note: String, var timestamp: MutableMap<String, String>)
    

请注意,所有mRef!! 调用也是有问题的。一方面,匈牙利符号(m 前缀)在 Kotlin 中通常不鼓励使用,!! 运算符也很危险。您最好尽早处理该引用的 null 情况,然后您可以更方便地使用它,而不必在代码中乱扔!!

我还鼓励您阅读 official documentationin this answer 的一般空安全性。

【讨论】:

  • "..!! is dangerous.." - 重要的是要记住,虽然是的,你应该意识到可以为空的场景,但在特定情况下有一些话要说(也许不是这个例子)即使返回类型可以是真的永远应该是 null - 然后手头有更大的问题 - 也许应用程序应该踢和尖叫直到工作流问题得到解决。
  • 当需要参数时,我已设置为在单例初始化之外查看此运算符的合法安全使用。无论你认为它在哪里可以安全使用,它都会回来咬你。
【解决方案3】:

你可以使用:

@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    相关资源
    最近更新 更多