1

我正在尝试使用 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();
    }
}

如您所见,我的适配器类在 my 中injects,那么为什么要提到父类呢?

此外,这是创建 ObjectGraph 的正确结构吗?关于includesand的文档addsTo非常稀少,所有像 U2020 这样的演示项目都与它们的实际含义模棱两可。我正在尝试分离模块,以便在需要时可以轻松覆盖它们。

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

4

2 回答 2

0

我最终解决了这个问题。出于某种原因,Dagger 无法注入我的适配器。我所做的是将毕加索注入适配器的父级(我的自定义视图),然后通过其构造函数将其传递给我的适配器。不知道为什么这比直接注入我的适配器更有效,因为现在我的 View 类中有一个无用的 Picasso 字段。我仍然对提供更好解决方案的其他答案持开放态度,但这目前有效。

于 2014-03-21T16:16:50.740 回答
-1

利用

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

代替

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

并添加

public void inject(Object object) { graph.inject(object); } 

在 MyApplication 中,如 Dagger 示例中所示。

于 2014-08-28T21:51:47.617 回答