Dagger2无法注入Context

最近两个月才刚开始在正式项目中使用Dagger2,在此记录一下遇到的坑

Dagger2无法注入Context

Moule 跟 Component 部分代码
@Module
public class ApplicationModule {
    private final Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Application provideApplication() {
        return application;
    }

    @Provides
    @ApplicationContext
    Context provideApplicationContext() {
        return application;
    }

    @Provides
    @Singleton
    TeacherService provideStudentService() {
        return ServiceFactory.makeStudentService();
    }

    @Provides
    @Singleton
    ActManager provideActManager() {
        return new ActManager();
    }
}

Module

@Module
public class ActivityModule {
    private Activity activity;

    public ActivityModule(Activity activity) {
        this.activity = activity;
    }

    @Provides
    public Activity provideActivity() {
        return activity;
    }

    @Provides
    @ActivityContext
    public Context provideContext() {
        return activity;
    }
}

ActivityComponent

@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {

    void inject(AttendanceActivity attendanceActivity);
}
使用情景

我希望把一个 RecyclerView 的 Adapter 通过 @Inject 注解注入到 Activity 中,adapter 的构造方法中包含一个 Context 参数

adapter

private  Context context;

@Inject
    public AttendanceAdapter( Context context)
        this.context = context;
    }
错误信息

在 activity 中使用 @Inject 注入这个 adapter 之后运行代码报错

Error:(43, 10) 错误: android.content.Context cannot be provided without an @Provides-annotated method.
android.content.Context is injected at
com.zidian.teacher.ui.course.adapter.AttendanceAdapter.<init>(context)
com.zidian.teacher.ui.course.adapter.AttendanceAdapter is injected at
com.zidian.teacher.ui.course.activity.AttendanceActivity.adapter
com.zidian.teacher.ui.course.activity.AttendanceActivity is injected at
com.zidian.teacher.di.componet.ActivityComponent.inject(attendanceActivity)

解决方案

错误信息里面说我没有无法为 adapter 的构造方法提供 Context 参数, 仔细看了几遍代码: 明明在 ActivityModule 里提供了 Context 实例,后面再看 ApplicationModule 发现里面也有提供 Context 实例的方法。
原来是 Dagger2 遇到两个相同的参数,不知道到底该提供哪一个给我的 adapter 使用, 这个时候才想起 @Qualifier 注解, 这个限定词就是专门为解决若一个类的实例有多种方法可以创建出来, Component 不知道选择哪种方法来创建该类的实例, 这个时候就需要我们用 @Qualifier 注解创建不同的限定符 比如: ApplicationContext, ActivityContext 等
修改 Adapter 类的构造方法为:

@Inject
    public AttendanceAdapter(@ActivityContext Context context) {
        students = new ArrayList<>();
    }

再次编译代码,成功!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 部分内容参考自:[Android]使用Dagger 2依赖注入 - DI介绍(翻译)[Android]使用Dagg...
    AItsuki阅读 47,785评论 66 356
  • 本文的分析基于dagger2的2.7版本。 谷歌开发维护的Dagger2出来有很长时间了,目前在很多开源项目上也能...
    sososeen09阅读 13,659评论 31 108
  • dagger2是用于进行依赖注入的框架。dagger1由square开发,而现在dagger2由google继续开...
    Uprising阅读 6,392评论 1 11
  • ****(说在最前:阅读本篇之前,希望大家对Dagger2已经有了一个初步的了解。从而帮助感觉似是而非的同学进一步...
    我是昵称阅读 944评论 3 6
  • 我们总拿顺其自然 来敷衍人生道路上的荆棘, 却很少有人承认, 真正的顺其自然 其实是竭尽所能之后的不强求, 而非两...
    如蕤_阅读 119评论 0 0