【问题标题】:Unable to create instance of viewmodel class in kotlin无法在 kotlin 中创建视图模型类的实例
【发布时间】:2021-05-21 20:48:57
【问题描述】:

我是 viewmodel 和房间数据库的新手。我正在学习教程

https://www.adictosaltrabajo.com/2019/03/04/persistencia-de-datos-en-android-con-room/

但是当我运行应用程序时出现错误

"Unable to start activity ComponentInfo{com.example.romapp/com.example.romapp.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.romapp.ViewModel.ContactsViewModel"

这是我的视图模型类

class ContactsViewModel(application: Application) : AndroidViewModel(application) {
    private val repository = ContactsRepository(application)
    val contacts = repository.getContacts()

    fun saveContact(contact: Person) {
        repository.insert(contact)
    }
}

这是我的仓库

class ContactsRepository(application: Application) {
    private val contactDao: ContactDao? = com.example.romapp.DataBase.ContactsDatabase.getInstance(application)?.contactDao()

    fun insert(contact: Person) {
        if (contactDao != null) InsertAsyncTask(contactDao).execute(contact)
    }

    fun getContacts(): LiveData<List<Person>> {
        return contactDao?.getOrderedAgenda() ?: MutableLiveData<List<Person>>()
    }

    private class InsertAsyncTask(private val contactDao: ContactDao) :
        AsyncTask<Person, Void, Void>() {
        override fun doInBackground(vararg contacts: Person?): Void? {
            for (contact in contacts) {
                if (contact != null) contactDao.insert(contact)
            }
            return null
        }
    }
}

这是我的主类创建

contactsViewModel = run {
            ViewModelProviders.of(this).get(ContactsViewModel::class.java)
        }

这是我添加到我的 build.gradle 的内容

implementation 'android.arch.persistence.room:runtime:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'

implementation "android.arch.lifecycle:extensions:1.1.1"

任何帮助或建议都会很棒

【问题讨论】:

  • 您能否将您的dependencies 块包含在您的build.gradle 文件中?这看起来您使用的是更新版本的 Lifecycle,但不是足够新的 Fragments/Activity 版本。
  • 感谢您的回复。我修改了问题
  • 您是否有理由使用长期弃用的 android.arch 版本而不是使用 AndroidX 版本?
  • 我正在学习教程,因为我是新手

标签: android kotlin android-room viewmodel


【解决方案1】:

首先,您应该以这种方式初始化您的存储库


class MyRepository (private val api: ApiInterface,private val db:Dao){
     // work with db and Api here
}

其次,你的视图模型应该是这样的:


class MyViewModel (private val myRepository: MyRepository) : ViewModel() {
  //work with you reposiroty here... 
}

最后当你想在 ui 层中使用你的 ViewModel 实例时。像这样写。

 private lateinit var mViewModel : MyViewModel
.
.
.
.
.
.
.
.

 mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);

现在您应该能够正确使用您的 ViewModel。

【讨论】:

  • 感谢您的回复。我去看看
【解决方案2】:

那是因为您正在尝试实例化需要提供参数的视图模型。 你应该使用ViewModelFactory 来实例化它。更多详情见this link

【讨论】:

  • 感谢您的回复。我去看看
猜你喜欢
  • 2011-12-20
  • 1970-01-01
  • 2022-07-20
  • 2018-11-02
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
相关资源
最近更新 更多