Android lateinit属性newTrack尚未初始化

Android lateinit属性newTrack尚未初始化,android,firebase,kotlin,Android,Firebase,Kotlin,当我启动应用程序时,它会崩溃,我在logcat中收到以下错误消息: “lateinit属性newTrack尚未初始化” 我已经找到了我的“showdata”函数的问题,但我看不出是什么问题 class MainActivity : AppCompatActivity(), View.OnClickListener { val collection = "song" val artistName = "name" val trackName = "track" v

当我启动应用程序时,它会崩溃,我在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
        }
    }
}
class MainActivity:AppCompatActivity(),View.OnClickListener{
val collection=“宋”
val artistName=“name”
val trackName=“track”
var docId=“”
lateinit var newTrack:配乐
lateinit var db:FirebaseFirestore
lateinit var alSongs:ArrayList
lateinit变量适配器:SimpleAdapter
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
alSongs=ArrayList()
addData.setOnClickListener(此)
updateInfo.setOnClickListener(此)
deleteInfo.setOnClickListener(此)
IsData.setOnItemClickListener(项目单击)
}
覆盖有趣的onStart(){
super.onStart()
db=FirebaseFirestore.getInstance()
db.collection(collection.addSnapshotListener{querySnapshot,e->
如果(e!=null)Log.d(“fireStore”,e.message)
showData()
}
}
覆盖有趣的onClick(v:视图?){
何时(v?.id){
//通过输入添加新数据
R.id.addData->{
val hm=HashMap()
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(此“数据已成功添加”,Toast.LENGTH\u SHORT)
.show()
}.addOnFailureListener{e->
Toast.makeText(此“数据添加失败:${e.message}”,Toast.LENGTH\u SHORT)
.show()
}
}
//更新输入
R.id.updateInfo->{
val hm=HashMap()
hm.set(newTrack.name,ArtistName.text.toString())
hm.set(newTrack.track,track.text.toString())
db.collection(collection).文档(docId).更新(hm)
.addOnSuccessListener{Toast.makeText(此“数据已成功更新”,Toast.LENGTH\u SHORT)
.show()}
.addOnFailureListener{e->
Toast.makeText(此“数据更新失败:${e.message}”,Toast.LENGTH\u SHORT)
.show()
}
}
//删除输入
R.id.deleteInfo->{
db.collection(collection).whereEqualTo(newTrack.name,docId).get().addOnSuccessListener{
结果->
用于(结果中的文档){
db.collection(collection).document(doc.id).delete()
.addOnSuccessListener{
Toast.makeText(此“数据已成功更新”,Toast.LENGTH\u SHORT)
.show()
}.addOnFailureListener{e->
Toast.makeText(此“数据更新失败:${e.message}”,Toast.LENGTH\u SHORT)
.show()
}
}
}.addOnFailureListener{e->
Toast.makeText(这是“无法获取数据引用:${e.message}”,Toast.LENGTH\u SHORT)
.show()
}
}
}
}
val itemClick=AdapterView.OnItemClickListener{父级,视图,位置,id->
val hm=alSongs.get(位置)
docId=hm.get(newTrack.name).toString()
ArtistName.setText(hm.get(newTrack.name.toString())
track.setText(hm.get(newTrack.name).toString())
}
//显示输入数据
趣味showData(){
db.collection(collection.get().addOnSuccessListener{result->
阿尔松
用于(结果中的文档){
val hm=HashMap()
hm.set(newTrack.name,doc.get(newTrack.name.toString())
hm.set(newTrack.track,doc.get(newTrack.track.toString())
阿尔松加(hm)
}
adapter=SimpleAdapter(此、alSongs、R.layout.row_数据、,
数组(newTrack.name,newTrack.track),
intArrayOf(R.id.txName,R.id.TxTrack))
IsData.adapter=适配器
}
}
}

您应该初始化newTrack变量,或者检查它是否已初始化

if(::newTrack.isInitialized){
  // logic
}else{
 newTrack = SoundTrack()
}

您可以使用
.isInitialized
属性检查lateinit变量的初始化状态

if(this::newTrack.isInitialized){
    //newTrack is initialized
}else{
    //newTrack is not initialized
}

lateinit
的全部要点是防止可空性。当您使用
lateinit
时,您的意思是,当我想使用此值时,它将被初始化。当您在初始化之前尝试使用它时,会出现此错误,因此需要先初始化它


你可以使用
如果(::newTrack.isInitialized)
就像其他人说的那样,但是我认为这违背了lateinit的目的

你能显示你的堆栈跟踪吗?你从来没有设置过
newTrack
。然后您尝试使用
newTrack.name
构建
simpledapter
,依此类推
lateinit var
的意思是“我保证在这里输入一个值”,而你没有。现在应用程序不会崩溃并按下我的所有按钮,但我无法在数组中插入新值。你有什么线索吗?