Ошибка «Обязательно: строка найдена: строка?» Котлин и Android Studio - PullRequest
0 голосов
/ 22 января 2019

Как видно из заголовка, я получаю красное подчеркивание под "id" в строке "var myNote = Note (id, title, note, ServerValue.TIMESTAMP)" Ошибка «Обязательно: строка найдена: строка?» 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>) {
}

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Ваше свойство id в Note объявлено как ненулевое String, а ключ, который у вас есть, является потенциально нулевым String?. Вам нужно преодолеть этот разрыв.

  1. Самый простой, но самый опасный способ - использовать !!, что приведет к исключению, если key был нулевым, т.е.

    var id = mRef!!.push().key!!
    
  2. Лучший способ - как-то обработать нулевой регистр, например, выполнив нулевую проверку:

    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, и оператор !! также опасен. Для этой ссылки лучше было бы обработать пустой случай раньше, и тогда вы могли бы использовать его более удобно, без необходимости засорять ваш код с помощью !!.

Я также призываю вас прочитать в этом ответе официальную документацию или в общем ответе .

0 голосов
/ 16 июля 2019

Вы можете использовать:

@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")

0 голосов
/ 22 января 2019

Kotlin заставляет вас быть сверхсознательным о nullability.

Ваша сущность Note говорит, что для нее требуется не обнуляемое id:String, и, очевидно, mRef!!.push().key возвращает String?, означающее, что это строка с нулевым значением. Вы можете исправить это двойным ударом, т.е. mReff!!.push().key!!

Другой совет - ALT+ENTER эти ошибки, связанные с Kotlin, он предоставит вам двойной удар.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...