ref.push().key & ref.child (Type mismatch)



我在本教程中遇到了一个问题。。。https://www.youtube.com/watch?v=I485b7LzYkM

共有三项。一个editText、一个ratingBar和一个按钮。单击按钮时,评级将发送到数据库。但我对";heroId"在ref.child(heroId(下,我得到错误";类型不匹配:推断的类型是String?但是字符串应为";为heroId。有什么想法吗?

下面是代码:

class MainActivity : AppCompatActivity() {
lateinit var editTextName: EditText
lateinit var ratingBar: RatingBar
lateinit var buttonSave: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
editTextName = findViewById(R.id.editTextName)
ratingBar = findViewById(R.id.ratingBar)
buttonSave = findViewById(R.id.ratingBar)
buttonSave.setOnClickListener {
saveHero()
}
}
private fun saveHero() {
val name = editTextName.text.toString().trim()
if (name.isEmpty()) {
editTextName.error = "Please enter a name"
return
}
val ref = FirebaseDatabase.getInstance().getReference("heroes")
val heroId = ref.push().key
val hero = Hero(heroId, name, ratingBar.numStars)
ref.child(heroId).setValue(hero).addOnCanceledListener {
Toast.makeText(applicationContext, "Hero saved", Toast.LENGTH_LONG).show()
}

}
}

谢谢!

val heroId = ref.push().key代码段使用DatabaseReference.getKey()方法,该方法返回一个String?,因此是一个可选字符串。

DatabaseReference.child()方法需要一个String,因此是一个非可选字符串。

因此,您需要确保可选字符串确实有一个值。由于你在客户端生成它,这已经得到了代码的保证,所以你可以硬转换它:

val heroId = ref.push().key!!

要了解有关处理这些可选类型和null安全性的所有信息,我建议在Kotlin文档中花一些时间了解null安全性。

相关内容