【问题标题】:Kotin lateinit Var Not initialized - Android StudioKotlin lateinit Var 未初始化 - Android Studio
【发布时间】:2020-08-08 08:20:03
【问题描述】:

我正在开发一个简单的联系人应用程序,该应用程序存储联系人的姓名、电子邮件和电话号码。 语言:科特林 架构:MVVM 但我收到一个错误:lateinit property addContactViewModel has not been initialized

活动:

class AddContact : AppCompatActivity() {

private lateinit var addContactViewModel : AddContactViewModel

companion object{
    const val EXTRA_REPLY = "com.room.contacts.REPLY"
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding  = DataBindingUtil.setContentView<ActivityAddContactBinding>(
        this,R.layout.activity_add_contact
    )

    binding.btnSave.setOnClickListener {
        val replyIntent = Intent()
        val fname= binding.fnameEdit.text.toString()
        val lname= binding.lnameEdit.text.toString()
        val email = binding.emailAddressEdit.text.toString()
        val contactno = binding.contactNumberEdit.text.toString()
        val contact = Contact(fname, lname,email,contactno)
        addContactViewModel.insert(contact)
        val intent = Intent(this, ContactList::class.java)
        // start your next activity
        startActivity(intent)
    }

}}

视图模型:

class AddContactViewModel (application: Application) : AndroidViewModel(application){

private val repository: ContactRepository

init {
    val contactsDao= ContactRoomDatabase.getDatabase(application).contactDao()
    repository = ContactRepository(contactsDao)
}

fun insert(contact: Contact) = viewModelScope.launch {
    repository.insert(contact)
}}

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.room.contacts, PID: 29383
kotlin.UninitializedPropertyAccessException: lateinit property addContactViewModel has not been initialized
    at com.room.contacts.screens.addContact.AddContact.access$getAddContactViewModel$p(AddContact.kt:15)
    at com.room.contacts.screens.addContact.AddContact$onCreate$1.onClick(AddContact.kt:36)
    at android.view.View.performClick(View.java:4781)
    at android.view.View$PerformClick.run(View.java:19907)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:160)
    at android.app.ActivityThread.main(ActivityThread.java:5541)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)

【问题讨论】:

  • 您应该在 oncreate 中初始化 addContactViewModel,而不是在 setOnClickListener 中
  • @MohammadMoeinGolchin 是的!这就说得通了!就这样解决了。谢谢
  • 为什么改了正确答案?
  • 你的回答也是正确的。我深入研究它,似乎更好的做事方式是使用惰性属性。您的答案是正确的,但另一个似乎是更好的选择。

标签: android android-studio kotlin mvvm kotlin-lateinit


【解决方案1】:

您可以将其设置为 lazy 属性,而不是将您的 addContactViewModel 作为 lateinit 属性,以便在您第一次尝试在某处使用它时对其进行初始化:

class AddContact : AppCompatActivity() {
    private val addContactViewModel : AddContactViewModel by lazy {
        ViewModelProvider(this).get(AddContactViewModel::class.java)
    }

【讨论】:

  • 这也有效!但我没有在监听器中实例化 lateinit var,而是在 onCreate 中实例化它,这对我有用。此解决方案也有效。
  • 是的,两者都有效。但是lazy 属性的好处是您不会忘记对其进行初始化。您可以将其设为val,这与必须为var 的lateinit 属性不同。
【解决方案2】:

您应该在 oncreate 中初始化 addContactViewModel,而不是在 setOnClickListener 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2020-04-14
    • 2021-10-13
    • 2022-07-05
    • 1970-01-01
    相关资源
    最近更新 更多