web-dev-qa-db-ja.com

カスタムViewModelのインスタンスを作成できません

Dagger2ライブラリを使用しています。プロジェクトを実行しようとすると、ビューモデルクラスのインスタンスを作成できないと言われます。

インスタンスを作成しようとしている主なアクティビティ

   ((MovieApplication) getApplication()).getAppComponent().inject(this);
    mViewModel = ViewModelProviders.of(this).get(MoviesDataViewModel.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");
}

私のログ

  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)
15
Mohit Goel

の代わりに:

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

実行:

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

複数のアクティビティを使用する場合は、すべてのアクティビティに以下のコードを追加する必要があります

AndroidInjection.inject(this);
2
Suman

私の解決策は、Dagger2を使用していたため、アクティビティを注入することでした。

        AndroidInjection.inject(this);
2

ViewModelクラスからAndroidViewModelを拡張します。

public class YourViewModel extends AndroidViewModel {

    public YourViewModel(Application application) {
        super(application);

        //Todo: ...
    }
}
0
Yamini