我正在试验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的正确结构吗? includes
和addsTo
上的文档非常稀少,所有像U2020这样的演示项目都与它们的实际含义不明确。我试图将模块分开,以便在需要时可以轻松覆盖它们。
编辑:事实证明,即使我将父类添加到两个模块,我也会得到异常。这很奇怪。
答案 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中。