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)
Au lieu de:
mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.class);
Effectuer:
mViewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesDataViewModel.class);
Besoin d'ajouter le code ci-dessous dans toutes les activités si vous utilisez plusieurs activités
AndroidInjection.inject(this);
La solution pour moi était d’injecter l’activité parce que j’utilisais Dagger2
AndroidInjection.inject(this);