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

时间:2015-01-15 09:43:49

标签: android view dependency-injection dagger

我正在使用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.

2 个答案:

答案 0 :(得分:1)

首先,您应该将@Module - 带注释的类传递给ObjectGraph.create(),而不是Activity类。其次,您不应该在每次需要inject()某事时创建图表。 通常的做法是将objectGraph列为Application类的字段。这就是你能得到的:

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

然后在Activity的{​​{1}}:

onCreate()

并且不要忘记尽快清除对GC的本地图表的强烈参考:

@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
}

答案 1 :(得分:0)

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

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

这让它发挥作用。

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