在androidx中更改ViewModelProviders.of时出错

问题描述 投票:0回答:1

我仍在学习mvvm并将我的应用程序升级到最新的androidx版本,但是这个问题使我停了下来。到目前为止我所做的我尝试了在stackoverflow和google android文档中提供的建议。如何获得我使用的项目资源在android studio中创建新项目,然后选择提供的登录模板。错误该代码运行良好,但是建议不要使用下面一行中的ViewModel.of

loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory()).get(LoginViewModel.class);

我已将其替换为loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class);,但在运行时出现错误。错误在下面的日志中。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.securitycavern.registerandlogin/com.securitycavern.registerandlogin.ui.login.LoginActivity}: java.lang.RuntimeException: Cannot create an instance of class com.securitycavern.registerandlogin.ui.login.LoginViewModel
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3121)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3264)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7078)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:974)
 Caused by: java.lang.RuntimeException: Cannot create an instance of class com.securitycavern.registerandlogin.ui.login.LoginViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.securitycavern.registerandlogin.ui.login.LoginActivity.onCreate(LoginActivity.java:39)
    at android.app.Activity.performCreate(Activity.java:7327)
    at android.app.Activity.performCreate(Activity.java:7318)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1275)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3101)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3264) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7078) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:974) 
 Caused by: java.lang.InstantiationException: java.lang.Class<com.securitycavern.registerandlogin.ui.login.LoginViewModel> 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.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185) 
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 
    at com.securitycavern.registerandlogin.ui.login.LoginActivity.onCreate(LoginActivity.java:39) 
    at android.app.Activity.performCreate(Activity.java:7327) 
    at android.app.Activity.performCreate(Activity.java:7318) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1275) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3101) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3264) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7078) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:974) 

我已将构造函数更改为public,但是在构造函数中它仍然因上述错误而崩溃,它再次建议构造函数可以是私有的。

android-viewmodel viewmodelproviders
1个回答
0
投票

当我在构造函数中使用应用程序上下文并使用viewmodel扩展viewmodel时,我也遇到了这个问题。

我如何更正它在下面给出。

使用AndroidViewModel扩展您的视图模型

在您的viewmodel构造函数中,将super(application)添加为第一行。看下面的例子。

public NoteViewModel(@NonNull Application application) {
       super(application);
       //your code here
    }
© www.soinside.com 2019 - 2024. All rights reserved.