Hello Developer, Hope you guys are doing great. Today at Tutorial Guruji Official website, we are sharing the answer of Cannot create an instance of custom ViewModel without wasting too much if your time.
The question is published on by Tutorial Guruji team.
The question is published on by Tutorial Guruji team.
I am using dagger2 library. whenever I am trying to run my project is says not able to create instance of view model class.
main activity where I am trying to create an instance
((MovieApplication) getApplication()).getAppComponent().inject(this); mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
My factory class
public class ViewModelFactory implements ViewModelProvider.Factory { private MoviesDataViewModel mViewModel; @Inject public ViewModelFactory(MoviesDataViewModel viewModel) { this.mViewModel = viewModel; } @Override public <T extends ViewModel> T create(Class<T> modelClass) { if (modelClass.isAssignableFrom(MoviesDataViewModel.class)) { return (T) mViewModel; } throw new IllegalArgumentException("Unknown class name"); }
My log
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.moviedata.viewmodel.MoviesDataViewModel at android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:145) at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(ViewModelProviders.java:143) at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128) at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:96) at com.moviedata.ui.MainActivity.onCreate(MainActivity.java:28) at android.app.Activity.performCreate(Activity.java:6321) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535) at android.app.ActivityThread.access$1100(ActivityThread.java:154) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1396) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5582) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.InstantiationException: java.lang.Class<com.moviedata.viewmodel.MoviesDataViewModel> has no zero argument constructor at java.lang.Class.newInstance(Native Method)
Answer
Instead of:
mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
Perform:
mViewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesDataViewModel.class);
We are here to answer your question about Cannot create an instance of custom ViewModel - If you find the proper solution, please don't forgot to share this with your team members.