当没有注射时,要求注射父母课程

时间:2014-03-18 20:46:32

标签: android dagger

我正在试验Dagger并尝试设置ObjectGraph。我创建了一个BaseModule,其中包含我的SharedPreferences和Bus之类的东西。我创建了一个WidgetModule,其中包含毕加索等用于图像加载的内容。

我试图将Picasso注入我的一个适配器类中。在适配器构造函数中,我得到了我的ObjectGraph实例,然后注入适配器。我得到一个运行时异常抱怨:

Caused by: java.lang.IllegalArgumentException: No inject registered for members/<ParentClass>$1. You must explicitly add it to the 'injects' option in one of your modules.

这对我来说很奇怪,因为我不会在该课程中进行任何注射。 ParentClass是我创建适配器的地方,但注入发生在适配器本身。我是否真的需要声明没有注入我的injects注释的父类?这是我的适配器构造函数:

public MyAdapter(Context context, int textViewResourceId, List<Item> items) {
        super(context, textViewResourceId, items);
        MyApplication.get(getContext()).inject(this); //exception occurs here
}

以下是我的模块:

@Module(
        injects = {
                MyApplication.class,
        }
)
public final class BaseModule {
    //...
}

@Module(
        injects = MyAdapter.class
)
public class WidgetModule {
    public WidgetModule(Application app) {
        this.app = app;
    }

    @Provides
    @Singleton
    Picasso providePicasso() {
        return new Picasso.Builder(app)
                .build();
    }
}

正如您所看到的,我的injects中有我的适配器类,那为什么它会提到父类呢?

另外,这是创建ObjectGraph的正确结构吗? includesaddsTo上的文档非常稀少,所有像U2020这样的演示项目都与它们的实际含义不明确。我试图将模块分开,以便在需要时可以轻松覆盖它们。

编辑:事实证明,即使我将父类添加到两个模块,我也会得到异常。这很奇怪。

2 个答案:

答案 0 :(得分:0)

我最终解决了这个问题。出于某种原因,Dagger无法注入我的适配器。我做的是将Picasso注入适配器的父级(我的自定义视图),然后通过其构造函数将其传递给我的适配器。不知道为什么这个工作与直接注入我的适配器相反,因为现在我的View类中有一个无用的Picasso字段。我仍然愿意接受提供更好解决方案的其他答案,但现在这种方法仍有效。

答案 1 :(得分:-1)

使用

((MyApplication) context.getApplicationContext()).inject(this);

而不是

MyApplication.get(getContext()).inject(this);

并添加

public void inject(Object object) { graph.inject(object); } 
如在Dagger示例中所见,在MyApplication中