Como sugiere el título, aparece un subrayado rojo debajo de "id" en la línea "var myNote = Note(id, title, note, ServerValue.TIMESTAMP)" Error "¿Requerido:Cadena encontrada:Cadena?" Kotlin y 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() } } } }
Aquí está mi clase 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>) { }
Kotlin te obliga a ser hiperconsciente sobre la nulabilidad.
Su entidad Note
dice que requiere una id:String
no anulable, y aparentemente, mRef!!.push().key
devuelve una String?
lo que significa que es una cadena anulable. Puede arreglar esto golpeándolo dos veces, es decir, mReff!!.push().key!!
Otro consejo es ALT+ENTER
en estos errores relacionados con Kotlin, te proporcionará el doble golpe.
Su propiedad de id
en Note
se declara como String
no nula, mientras que la clave que tiene es una String?
. Necesitas cerrar esta brecha.
¡La forma más simple pero más peligrosa es usar !!
, que producirá una excepción si la key
era nula, es decir
var id = mRef!!.push().key!!
Una mejor manera es manejar el caso nulo de alguna manera, por ejemplo, realizando una verificación nula:
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 }
También puede hacer que la propiedad en su propia clase sea anulable y tratar con el valor de ID que podría ser nulo más adelante:
class Note (var id: String?, var title: String, var note: String, var timestamp: MutableMap<String, String>)
Tenga en cuenta que todos los mRef!!
Las llamadas también son problemáticas. Por un lado, la notación húngara (el prefijo m
) generalmente se desaconseja en Kotlin, y el !!
el operador también es peligroso. ¡Será mejor que maneje el caso nulo temprano para esa referencia, y luego podría usarlo de manera más conveniente, sin tener que ensuciar su código con !!
.
También lo animo a leer sobre seguridad nula en general la documentación oficial o en esta respuesta .
Puedes usar:
@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")