Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot create an instance of custom ViewModel

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)
like image 793
Mohit Goel Avatar asked Aug 02 '17 11:08

Mohit Goel


People also ask

How do you instantiate a ViewModel in Java?

To instantiate such basic viewmodel, create a ViewModelProvider with current activity/fragment reference and invoke get method with ViewModel's class.

Is ViewModel deprecated?

Public methods. This method is deprecated. Use the 'by viewModels()' Kotlin property delegate or ViewModelProvider , passing in the fragment. This method is deprecated.

Can an activity have a ViewModel?

In android, we can use ViewModel to share data between various fragments or activities by sharing the same ViewModel among all the fragments and they can access everything defined in the ViewModel. This is one way to have communication between fragments or activities.


2 Answers

Instead of:

mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);

Perform:

mViewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesDataViewModel.class);
like image 141
azizbekian Avatar answered Oct 26 '22 09:10

azizbekian


The solution for me was injecting the activity because I was using Dagger2

        AndroidInjection.inject(this);
like image 43
Faustino Gagneten Avatar answered Oct 26 '22 10:10

Faustino Gagneten