无法在新项目中创建ViewModel类的实例 [英] Cannot create an instance of class ViewModel in the new project

查看:159
本文介绍了无法在新项目中创建ViewModel类的实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个不同的项目.在第一个中,我将ViewModel与我的活动和Room数据库一起使用.一切正常.然后我只是出于不同的目的创建了一个新项目,在那里我以完全相同的方式实例化了ViewModel,但是我的应用程序因以下错误而崩溃:

I have two different projects. In the first one I use ViewModel with my activity and Room database. Everything works. Then I just created new project for different purposes and there I instantiate ViewModel absolutely the same way, but my app crashes with this error:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.MainViewModel
    at android.app.ActivityThread.performLaunchActivity(Unknown Source:591)
    at android.app.ActivityThread.handleLaunchActivity(Unknown Source:36)
    at android.app.servertransaction.LaunchActivityItem.execute(Unknown Source:57)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(Unknown Source:99)
    at android.app.servertransaction.TransactionExecutor.execute(Unknown Source:34)
    at android.app.ActivityThread$H.handleMessage(Unknown Source:36)
    at android.os.Handler.dispatchMessage(Unknown Source:21)
    at android.os.Looper.loop(Unknown Source:207)
    at android.app.ActivityThread.main(Unknown Source:107)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:11)
    at com.android.internal.os.ZygoteInit.main(Unknown Source:274)
 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.MainViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.kazguiu.MainActivity.applyAdapterAndViewModel(MainActivity.kt:37)
    at com.kazguiu.MainActivity.onCreate(MainActivity.kt:25)
    at android.app.Activity.performCreate(Unknown Source:16)
    at android.app.Activity.performCreate(Unknown Source:1)
    at android.app.Instrumentation.callActivityOnCreate(Unknown Source:3)
    at android.app.ActivityThread.performLaunchActivity(Unknown Source:368)
    at android.app.ActivityThread.handleLaunchActivity(Unknown Source:36) 
    at android.app.servertransaction.LaunchActivityItem.execute(Unknown Source:57) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(Unknown Source:99) 
    at android.app.servertransaction.TransactionExecutor.execute(Unknown Source:34) 
    at android.app.ActivityThread$H.handleMessage(Unknown Source:36) 
    at android.os.Handler.dispatchMessage(Unknown Source:21) 
    at android.os.Looper.loop(Unknown Source:207) 
    at android.app.ActivityThread.main(Unknown Source:107) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:11) 
    at com.android.internal.os.ZygoteInit.main(Unknown Source:274) 
 Caused by: java.lang.InstantiationException: java.lang.Class<com.example.MainViewModel> has no zero argument constructor
    at java.lang.Class.newInstance(Native Method)
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)

我在这样的活动中实例化ViewModel:

I instantiate ViewModel in activity like this:

private lateinit var mainViewModel: MainViewModel

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    applyAdapterAndViewModel()

}

private fun applyAdapterAndViewModel() {
    mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)
}

我的ViewModel:

My ViewModel:

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

    private val exampleDao = Database.getDatabase(application).exampleDao()
    private val repository = Repository(exampleDao)

    fun getSubjects() = repository.getSubjects()

    fun addSubjects(subject: Subjects) = viewModelScope.launch(Dispatchers.IO) {
        repository.addSubject(subject)
    }

}

这种使用ViewModel的方式与我以前的项目相同.唯一的不同是,我当前的gradle中还有两个依赖项:

This way of using ViewModel is the same as my previous project. Only difference is that I have two additional dependencies in my current gradle:

implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'

如果我删除它们,则Android Studio无法识别ViewModelProvider,但是我以前的项目中根本没有这些依赖项,并且在那里我完全相同地使用LiveData和ViewModel(甚至导入也相同).那我该怎么办?

If I delete them, Android Studio doesn't recognize ViewModelProvider, but I don't have these dependencies in my previous projects at all and I use LiveData and ViewModel absolutely the same way(even the imports are the same) there. So, what am I supposed to do?

推荐答案

您的ViewModel需要一个参数application: Application,该参数只能通过使用像这样的ViewModelFactory来提供:

Your ViewModel requires an argument application: Application which can only be provided by using a ViewModelFactory like so:

ViewModelFactory

class MainViewModelFactory(
    private val application: Application
) : ViewModelProvider.Factory {
    @Suppress("unchecked_cast")
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MainViewModel::class.java)) {
            return MainViewModel(application) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

MainActivity

private fun applyAdapterAndViewModel() {
// Not so kotlinic
mainViewModel = ViewModelProvider(this,MainViewModelFactory(application)).get(MainViewModel::class.java)
}

此外,在MainActivity中,替换 private lateinit var mainViewModel: MainViewModel

Also, in MainActivity, replace private lateinit var mainViewModel: MainViewModel with

private val viewModel by viewModels<MainViewModel> { 
MainViewModelFactory(application) }

这篇关于无法在新项目中创建ViewModel类的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆