0

Java&Android の世界に戻ってきました。コンパイル時間 DI と MvvM を活用する優れたプロジェクト スターターを探していたところ、次の 2 つを見つけました。

  1. テスト可能な Android MVVM の作成
  2. 国 - サンプルの Android アプリ

さて、私の問題です...ベースアクティビティを次のようにしたいと思います(重要な部分を保持します):

public abstract class ViewModelActivity<VM extends IViewModel> extends AppCompatActivity {

private ActivityComponent activityComponent;
@Inject
private VM viewModel;

protected void inject(AppComponent appComponent) {
    appComponent.inject(this);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    AppComponent appComponent = ((MvvmApplication) getApplication()).getAppComponent();
    inject(appComponent);

    activityComponent =
            DaggerActivityComponent.builder()
            .appComponent(appComponent)
            .activityModule(new ActivityModule(this))
            .build();

    ViewModel.State savedViewModelState = null;
    if (savedInstanceState != null) {
        savedViewModelState = savedInstanceState.getParcelable(EXTRA_VIEW_MODEL_STATE);
    }
    viewModel = createViewModel(savedViewModelState);
}

}

したがって、私の AppComponent は次のようになります。

@AppScope
@Component(modules = {
    AppContextModule.class,
    AppModule.class,
    NetworkModule.class,
    GsonModule.class
})
public interface MyAppComponent extends AppComponent {

    void inject(DashboardActivity baseActivity);

    Picasso picasso();

}

AppComponent の場所:

@AppScope
public interface AppComponent {

    Context appContext();

    void inject(ViewModelActivity viewModelActivity);

}

最後に、具体的なアクティビティは次のとおりです。

public class DashboardActivity extends ViewModelActivity<DashboardViewModel> {}

今、次のエラーが発生し続けます。

Error:(29, 10) error: activities.dashboard.DashboardViewModel cannot be 
provided without an @Inject constructor or from an @Provides- or @Produces-
annotated method. This type supports members injection but cannot be 
implicitly provided.
activities.dashboard.DashboardViewModel is injected at
mvvm.activity.ViewModelActivity.viewModel
activities.dashboard.DashboardActivity is injected at
app.inject(baseActivity)

私は何が欠けていますか?

ありがとう!

4

1 に答える 1