web-dev-qa-db-fra.com

Impossible de créer une instance de ViewModel personnalisé

J'utilise la bibliothèque Dagger2. chaque fois que j'essaie d'exécuter mon projet, il est impossible de créer une instance de classe de modèle de vue.

activité principale où j'essaie de créer une instance

   ((MovieApplication) getApplication()).getAppComponent().inject(this);
    mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);

Ma classe d'usine

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");
}

Mon 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)
12
Mohit Goel

Au lieu de:

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

Effectuer:

mViewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesDataViewModel.class);
8
azizbekian

Besoin d'ajouter le code ci-dessous dans toutes les activités si vous utilisez plusieurs activités 

AndroidInjection.inject(this);
1
Suman

La solution pour moi était d’injecter l’activité parce que j’utilisais Dagger2

        AndroidInjection.inject(this);
1
Faustino Gagneten