首页 > 解决方案 > Kotlin lateInit 尚未初始化错误崩溃应用程序

问题描述

我有一个 Android Kotlin 应用程序片段,在资源布局中包含三个元素:

<EditText android:id="@+id/forename_input_account"/>
<EditText android:id="@+id/surname_input_account"/>
<Button android:id="@+id/saveButton"/>

单击保存时,我需要将两个 EditText 字段的内容写入项目 Firebase Realtime DB。

在帐户片段文件中,我有以下内容:

class AccountFragment : Fragment() {

    lateinit var forename_input_account: EditText
    lateinit var surname_input_account: EditText
    lateinit var saveButton: Button

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

            forename_input_account = forename_input_account
            surname_input_account = surname_input_account
            saveButton = saveButton

            saveButton.setOnClickListener {
                saveAccount()
            }

    }

    private fun saveAccount(){
        val firstname = forename_input_account.text.toString().trim()
        val lastname = lastname_input_account.text.toString().trim()

        val ref = FirebaseDatabase.getInstance().getReference("mySaveLocation")
        val saveId = ref.push().key

        val myRecord = save(saveId, firstname, lastname)

        ref.child(saveId.toString()).setValue(myRecord).addOnCompleteListener{

        }
    }

}

firstname 和 lastname 在单独的文件中声明如下:

class Hero(val id: String?, val firstname: String, val lastname: String)

当我运行应用程序并导航到片段时,应用程序崩溃并出现以下错误:

kotlin.UninitializedPropertyAccessException:lateinit 属性 forename_input_account 尚未初始化

标签: androidfirebasefirebase-realtime-databasekotlin

解决方案


forename_input_account = forename_input_account设置forename_input_account为自己。这没有实际效果,并且由于您lateinit var在为其分配值之前尝试访问它,因此您会崩溃。

如果您尝试使用Kotlin 合成属性,请删除这三个lateinit var属性并只使用 Kotlin 合成属性,范围是指膨胀的view.

否则,您需要使用findViewById()or 来获取View分配给这些lateinit var属性的东西(例如,forename_input_account = view.findViewById(R.id.forename_input_account))。


推荐阅读