свойство lateinit newTrack не было инициализировано - PullRequest
0 голосов
/ 07 апреля 2020

Когда я запускаю свое приложение, оно вызывает sh, и я получаю следующее сообщение об ошибке в logcat:

"свойство lateinit newTrack не было инициализировано"

Я обнаружил проблему в моя функция "showdata", но я не вижу, в чем проблема.

class MainActivity : AppCompatActivity(), View.OnClickListener {

    val collection = "song"
    val artistName = "name"
    val trackName = "track"
    var docId =""

    lateinit var newTrack : SoundTrack
    lateinit var  db : FirebaseFirestore
    lateinit var alSongs : ArrayList<HashMap<String,Any>>
    lateinit var adapter: SimpleAdapter


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

        alSongs = ArrayList()
        addData.setOnClickListener(this)
        updateInfo.setOnClickListener(this)
        deleteInfo.setOnClickListener(this)
        IsData.setOnItemClickListener(itemClick)

    }

    override fun onStart() {
        super.onStart()
        db = FirebaseFirestore.getInstance()
        db.collection(collection).addSnapshotListener { querySnapshot, e ->
            if(e != null) Log.d("fireStore", e.message)
            showData()

        }
    }

    override fun onClick(v: View?) {
        when(v?.id){
            //add new data by input
            R.id.addData ->{

                val hm = HashMap<String, Any>()
                hm.set(newTrack.name,ArtistName.text.toString())
                hm.set(newTrack.track,track.text.toString())
                db.collection(collection).document(ArtistName.text.toString()).set(hm).
                    addOnSuccessListener {
                        Toast.makeText(this, "Data Successfully added", Toast.LENGTH_SHORT)
                            .show()
                    }.addOnFailureListener { e ->
                    Toast.makeText(this, "Data unSuccessfully added : ${e.message}", Toast.LENGTH_SHORT)
                        .show()
                }
            }
            //Update input
            R.id.updateInfo -> {

                val hm = HashMap<String, Any>()
                hm.set(newTrack.name,ArtistName.text.toString())
                hm.set(newTrack.track,track.text.toString())
                db.collection(collection).document(docId).update(hm)
                    .addOnSuccessListener { Toast.makeText(this, "Data Successfully updated", Toast.LENGTH_SHORT)
                        .show() }
                    .addOnFailureListener { e ->
                        Toast.makeText(this, "Data unSuccessfully updated : ${e.message}", Toast.LENGTH_SHORT)
                            .show()
                    }
            }
            //delete Input 
            R.id.deleteInfo -> {
                db.collection(collection).whereEqualTo(newTrack.name,docId).get().addOnSuccessListener {
                        results ->
                    for(doc in results){
                        db.collection(collection).document(doc.id).delete()
                            .addOnSuccessListener {
                                Toast.makeText(this, "Data Successfully updated", Toast.LENGTH_SHORT)
                                    .show()
                            }.addOnFailureListener { e ->
                                Toast.makeText(this, "Data unSuccessfully updated : ${e.message}", Toast.LENGTH_SHORT)
                                    .show()
                            }
                    }
                }.addOnFailureListener { e ->
                    Toast.makeText(this, "Cant get data reference: ${e.message}", Toast.LENGTH_SHORT)
                        .show()
                }
            }
        }
    }

    val itemClick = AdapterView.OnItemClickListener { parent, view, position, id ->
        val hm = alSongs.get(position)
        docId = hm.get(newTrack.name).toString()
        ArtistName.setText(hm.get(newTrack.name).toString())
        track.setText(hm.get(newTrack.name).toString())
    }
//Show input data

    fun showData(){
        db.collection(collection).get().addOnSuccessListener { result ->

            alSongs.clear()
            for(doc in result){
                val hm = HashMap<String,Any>()
                hm.set(newTrack.name,doc.get(newTrack.name).toString())
                hm.set(newTrack.track,doc.get(newTrack.track).toString())
                alSongs.add(hm)
            }
            adapter = SimpleAdapter(this,alSongs,R.layout.row_data,
                arrayOf(newTrack.name,newTrack.track),
                intArrayOf(R.id.txName, R.id.TxTrack))
            IsData.adapter = adapter
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

Весь смысл lateinit состоит в том, чтобы предотвратить обнуляемость. Когда вы используете lateinit, вы говорите, что когда я захочу использовать это значение, оно будет инициализировано. Когда вы пытаетесь использовать его перед инициализацией, вы получаете эту ошибку, поэтому вам нужно сначала инициализировать ее

Вы можете использовать if(::newTrack.isInitialized), как говорили другие, но IMO, который побеждает цель lateinit

0 голосов
/ 07 апреля 2020

вы можете использовать свойство .isInitialized, можно проверить состояние инициализации переменной lateinit.

if(this::newTrack.isInitialized){
    //newTrack is initialized
}else{
    //newTrack is not initialized
}
0 голосов
/ 07 апреля 2020

Вы должны инициализировать переменную newTrack или проверить, инициализирована ли она

if(::newTrack.isInitialized){
  // logic
}else{
 newTrack = SoundTrack()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...