Android Dagger如何在View组件中进行DI

Android Dagger how to perform DI in View components

我正在使用 Dagger,到目前为止还不错。我有一个模块用于所有视图(活动和片段),我通过对象图注入它们。现在我想包含自定义视图,我的模块看起来像这样

@Module(
injects = {
    //Activity
    MainActivity.class,


    //Fragments
    LookupSearchResultsFragment.class,


    // Views

    MainSearchComponent.class
},
//includes = {
//    PersistenceModule.class
//},
library = true,
complete = false,
addsTo = AndroidModule.class)

在我的 MainSearchComponent 中,我应该如何注入 Object Graph?我目前正在这样做:

ObjectGraph.create((BaseActivity)getContext()).inject(this);

但是我得到了这个错误。 Caused by: java.lang.IllegalStateException: Module adapter for class ...MainActivity could not be loaded. Please ensure that code generation was run for this module.

好的,所以我找到了解决方案。我需要在指定组件的位置注入模块。所以对我来说,我不得不写下面的而不是

ObjectGraph.create((BaseActivity)getContext()).inject(this);

这成功了。

ObjectGraph.create(new AcitivityModule()).inject(this);

首先,您应该将 @Module 注释的 classes 传递给 ObjectGraph.create(),而不是 Activity classes。其次,您不应该每次需要 inject() 时都创建图形。 通常的做法是将 objectGraph 设为您的 Application class 的字段。这就是你能得到的:

// Application class
objectGraph = ObjectGraph.create(new AndroidModule());

然后在你的 ActivityonCreate():

@Override public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  MyApp app = (MyApp) getApplication();
  activityGraph = app.getObjectGraph().plus(new ActivityModule());
  activityGraph.inject(this); // inject with respect of activity-specific components
}

并且不要忘记清除对本地图的强引用以尽快对其进行 GC:

@Override public void onDestroy() {
  activityGraph = null;
  super.onDestroy();
}