简体   繁体   English

java.lang.RuntimeException:无法创建 class ViewModel [Kotlin] 的实例

[英]java.lang.RuntimeException: Cannot create an instance of class ViewModel [Kotlin]

I created Viewmodel instance and it worked few times, now it is showing error while initializing userPermissionViewModel in MainActivity.我创建了 Viewmodel 实例并且它工作了几次,现在它在 MainActivity 中初始化 userPermissionViewModel 时显示错误。

I am using DataStore to save data and try to observer the same.我正在使用 DataStore 来保存数据并尝试观察相同的数据。

I even tried initializing as below, but no luck我什至尝试如下初始化,但没有运气

userPermissionsViewModel = ViewModelProvider(this,ViewModelProvider.AndroidViewModelFactory.getInstance(this.application)).get(UserPermissionsViewModel::class.java)

Error Log错误日志

2020-12-11 16:13:40.785 13161-13161/com.lobostaffing.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.lobostaffing.app, PID: 13161
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lobostaffing.app/com.lobostaffing.app.mvvm.ui.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.lobostaffing.app.mvvm.viewmodels.UserPermissionsViewModel
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.lobostaffing.app.mvvm.viewmodels.UserPermissionsViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.lobostaffing.app.mvvm.ui.MainActivity.onCreate(MainActivity.kt:231)
    at android.app.Activity.performCreate(Activity.java:8000)
    at android.app.Activity.performCreate(Activity.java:7984)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:223) 
    at android.app.ActivityThread.main(ActivityThread.java:7656) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
 Caused by: java.lang.InstantiationException: java.lang.Class<com.lobostaffing.app.mvvm.viewmodels.UserPermissionsViewModel> has no zero argument constructor
    at java.lang.Class.newInstance(Native Method)
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 
    at com.lobostaffing.app.mvvm.ui.MainActivity.onCreate(MainActivity.kt:231) 
    at android.app.Activity.performCreate(Activity.java:8000) 
    at android.app.Activity.performCreate(Activity.java:7984) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:223) 
    at android.app.ActivityThread.main(ActivityThread.java:7656) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

MainActivity.kt MainActivity.kt

userPermissionsViewModel = ViewModelProvider(this).get(UserPermissionsViewModel::class.java)
    userPermissionsViewModel.readFromDataStore.observe(this, { userDetailModel ->
        setupNavDrawer(userDetailModel)
    })

UserPermissionsViewModel.kt UserPermissionsViewModel.kt

class UserPermissionsViewModel(application: Application): ViewModel() {

private val userPermissionsRepo = UserPermissionsRepo(application)

val readFromDataStore = userPermissionsRepo.userDetailModel.asLiveData()

fun saveToDataStore(userDetailModel: UserDetailModel) = viewModelScope.launch(Dispatchers.IO){
    userPermissionsRepo.saveUserPermissions(userDetailModel)
}}

Build.gradle Build.gradle

def archLifecycleVersion = '2.2.0'
//Lifecycle components
implementation "androidx.lifecycle:lifecycle-extensions:$archLifecycleVersion"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$archLifecycleVersion"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$archLifecycleVersion"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$archLifecycleVersion"

Initialize your viewmodel like this像这样初始化您的视图模型

yourViewModelInstance = new ViewModelProvider(this).get(YourViewModelClass.class);

Try this尝试这个

MainActivity:主要活动:

class MainActivity : AppCompatActivity() {

    private lateinit var userPermissionsViewModel: UserPermissionsViewModel

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

        userPermissionsViewModel = ViewModelProvider(this).get(UserPermissionsViewModel::class.java)

    }
}

And your viewModel:还有你的视图模型:

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

    private val userPermissionsRepo = UserPermissionsRepo(application)

}

When you need an application context in the ViewModel it should extend AndroidViewModel .当您需要 ViewModel 中的应用程序上下文时,它应该扩展AndroidViewModel
ViewModel with context:带有上下文的 ViewModel:

class UserPermissionsViewModel(application: Application) : AndroidViewModel(application)

or without context或没有上下文

class UserPermissionsViewModel : ViewModel()

When a regular ViewModel has any constructor paramaters, the default ViewModelFactory does not know how to create it.当常规 ViewModel 有任何构造函数参数时,默认 ViewModelFactory 不知道如何创建它。

Try to add the right dependencies尝试添加正确的依赖项

//lifecycle
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 java.lang.RuntimeException:无法创建 ViewModel class 的实例 - java.lang.RuntimeException: Cannot create an instance of ViewModel class java.lang.RuntimeException:无法创建 class com.example.cookpadapp.viewmodel.CookpadViewModel+ 的实例 - java.lang.RuntimeException: Cannot create an instance of class com.example.cookpadapp.viewmodel.CookpadViewModel+ at java.lang.RuntimeException:当android重新创建Activity和Fragment时,无法创建类ViewModel的实例 - java.lang.RuntimeException: Cannot create an instance of class ViewModel, when android recreates Activity and Fragment java.lang.RuntimeException:无法创建 yodgorbek.komilov.musobaqayangiliklari.viewmodel.MainViewModel 类的实例? - java.lang.RuntimeException: Cannot create an instance of class yodgorbek.komilov.musobaqayangiliklari.viewmodel.MainViewModel? Jetpack Compose + Hilt:java.lang.RuntimeException:无法创建 class ViewModel 的实例 - Jetpack Compose + Hilt: java.lang.RuntimeException: Cannot create an instance of class ViewModel java.lang.RuntimeException:无法在单元测试中创建 class ViewModel 的实例 - java.lang.RuntimeException: Cannot create an instance of class ViewModel in unit test java.lang.RuntimeException:无法创建类MovieViewModel的实例&存储库尚未初始化 - java.lang.RuntimeException: Cannot create an instance of class MovieViewModel& repository has not been initialized java.lang.RuntimeException:无法创建类 com.example.homeactivity.activities.editprofile.EditProfileViewModel 的实例 - java.lang.RuntimeException: Cannot create an instance of class com.example.homeactivity.activities.editprofile.EditProfileViewModel 刀柄匕首错误 java.lang.RuntimeException:无法创建 class HomeFragmentViewModel 的实例 - Hilt Dagger Error java.lang.RuntimeException: Cannot create an instance of class HomeFragmentViewModel java.lang.RuntimeException:无法序列化 - java.lang.RuntimeException: Cannot serialize
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM