6
votes

Erreur "Obligatoire: chaîne trouvée: chaîne?" Kotlin et Android Studio

Comme le titre l'indique, je reçois un soulignement rouge sous "id" sur la ligne "var myNote = Note (id, title, note, ServerValue.TIMESTAMP)" Erreur "Obligatoire: chaîne trouvée: chaîne?" Kotlin et Android Studio

package com.example.gearoidodonovan.books

import java.util.*

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

Voici ma classe Notes.kt

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


2 commentaires

Votre problème est conceptuellement équivalent à: stackoverflow.com/questions/36465626/…


lateinit var mRef: DatabaseReference permet d'éviter !! autour de mRef. La mRef !!. Push (). Key peut être nulle. Il appartient à votre base de données de comprendre si cela est possible ou non. Le moyen le plus sûr est d'ajouter une vérification de l'instruction null, e, g, if ou d'utiliser l'opérateur Elvis ?: pour passer une expression lorsque le côté gauche est nul


3 Réponses :


9
votes

Kotlin vous oblige à être hyper conscient de la nullité.

Votre entité Note dit qu'elle nécessite un id: String non nullable, et apparemment, mRef !!. push (). key renvoie une String? signifiant que c'est une chaîne Nullable. Vous pouvez résoudre ce problème en le frappant deux fois, c'est-à-dire mReff!!.push().key!!

Une autre astuce est de ALT + ENTER ces erreurs liées à Kotlin, cela vous fournira le double coup.


1 commentaires

Très appréciée!!



1
votes

Votre propriété id dans Remarque est déclarée comme String non nulle, tandis que la clé que vous avez est une chaîne potentiellement nulle ? . Vous devez combler cet écart.

  1. Le moyen le plus simple mais le plus dangereux est d'utiliser !! , qui produira une exception si la clé était nulle, c'est-à-dire

    class Note (var id: String?, var title: String, var note: String, var timestamp: MutableMap<String, String>)
    
  2. Une meilleure façon est de gérer le cas nul d'une manière ou d'une autre, par exemple en effectuant une vérification nulle:

    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. Vous pouvez également rendre la propriété de votre propre classe nullable, et gérer la valeur de l'ID qui y est potentiellement nulle plus tard:

    var id = mRef!!.push().key!!
    

Notez que tous les appels mRef !! sont également problématiques. D'une part, la notation hongroise (le préfixe m ) est généralement déconseillée dans Kotlin, et l'opérateur !! est également dangereux. Vous feriez mieux de gérer le cas nul tôt pour cette référence, puis vous pourriez l'utiliser plus facilement, sans avoir à jeter votre code avec !! .

J'ai aussi vous encourageons à consulter la documentation officielle ou la dans cette réponse .


2 commentaires

".. !! est dangereux .." - il est important de garder à l'esprit que si oui, vous devriez être conscient des scénarios nullables, il y a quelque chose à dire dans des situations spécifiques (peut-être pas cet exemple ) où quelque chose ne devrait vraiment jamais être nul, même si le type de retour peut être - alors il y a de plus gros problèmes à portée de main - peut-être que l'application devrait lancer et crier jusqu'à ce que le problème de flux de travail soit résolu.


Je me suis mis à voir une utilisation légitimement sûre de cet opérateur en dehors de l'initialisation singleton lorsque des paramètres sont requis. Peu importe où vous pensez qu'il est sûr de l'utiliser, il reviendra pour vous mordre.



0
votes

Vous pouvez utiliser:

@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")


0 commentaires