Kotlin lateInit尚未被初始化错误使应用程序崩溃

时间:2019-08-04 11:52:01

标签: android firebase firebase-realtime-database kotlin

我有一个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{

        }
    }

}

名字和姓氏在一个单独的文件中声明如下:

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

当我运行该应用程序并导航至该片段时,该应用程序崩溃并显示以下错误:

  

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

2 个答案:

答案 0 :(得分:2)

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

如果您尝试使用Kotlin synthetic properties,请删除三个lateinit var属性,而仅使用Kotlin合成属性,其作用域是指膨胀的view

否则,您需要使用findViewById()或其他方法来获取View分配给那些lateinit var属性(例如forename_input_account = view.findViewById(R.id.forename_input_account))。

答案 1 :(得分:2)

您可以添加onCreateView并在其中设置布局

fun onCreateView(inflater: LayoutInflater, @Nullable container: ViewGroup, @Nullable savedInstanceState: Bundle): View {

    return inflater.inflate(R.layout.example, container, false)
}