Je travaille sur une application de contact simple qui stocke le nom, l'adresse e-mail et le numéro du contact. Langue: Kotlin Architecture: MVVM Mais j'obtiens une erreur: lateinit property addContactViewModel has not been initialized

Activité:

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)
    }

}}

ViewModel:

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)
}}

Erreur:

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)
0
Haris Bin Saif 24 avril 2020 à 20:14

2 réponses

Meilleure réponse

Au lieu d'avoir votre addContactViewModel comme propriété lateinit, vous pouvez en faire une propriété lazy, afin qu'elle soit initialisée la première fois que vous essayez de l'utiliser quelque part:

class AddContact : AppCompatActivity() {
    private val addContactViewModel : AddContactViewModel by lazy {
        ViewModelProvider(this).get(AddContactViewModel::class.java)
    }
3
Michael 24 avril 2020 à 17:32

Vous devez initialiser addContactViewModel dans oncreate, pas dans setOnClickListener

0
MMG 24 avril 2020 à 17:40