Android 无法在新项目中创建类ViewModel的实例

Android 无法在新项目中创建类ViewModel的实例,android,kotlin,android-viewmodel,Android,Kotlin,Android Viewmodel,我有两个不同的项目。在第一个示例中,我将ViewModel与我的活动和房间数据库一起使用。一切正常。然后我为不同的目的创建了新项目,在那里我以完全相同的方式实例化ViewModel,但我的应用程序因以下错误而崩溃: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.MainActivity}: java.lang.RuntimeException: Cannot c

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

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:

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中有两个额外的依赖项:

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

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

您的ViewModel需要一个参数
application:application
,该参数只能通过使用ViewModelFactory提供,如下所示:

ViewModelFactory

class MainViewModelFactory(
私有val应用程序:应用程序
):ViewModelProvider.Factory{
@抑制(“未选中的_cast”)
重写趣味创建(modelClass:Class):T{
if(modelClass.isAssignableFrom(MainViewModel::class.java)){
将MainViewModel(应用程序)返回为T
}
抛出IllegalArgumentException(“未知ViewModel类”)
}
}
main活动

private fun applyAdapterAndViewModel(){
//不是那么科特林
mainViewModel=ViewModelProvider(这是MainViewModelFactory(应用程序)).get(mainViewModel::class.java)
}
此外,在MainActivity中,替换
private lateinit var mainViewModel:mainViewModel

private val viewModel by viewModels{
MainViewModelFactory(应用程序)}

是因为新的依赖关系吗?因为在另一个项目中,我不需要使用ViewModelFactory,所以每当需要向ViewModel添加参数时,都会使用ViewModelFactory。可能,另一个项目中的ViewModel没有参数。它完全相同。绝对地根据下面的链接,应该没问题
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'