dagger android 学习(三):ContributesAndroidInjector的进一步优化

5,372 阅读2分钟

本系列博客主要用于自己学习积累,顺便帮助新手入门,如有问题,多多包涵。更详细的一些使用可以看看其他更加详细的博客。

dagger android 学习(一):dagger基础使用
dagger android 学习(二):AndroidInjector的使用
dagger android 学习(三):ContributesAndroidInjector的进一步优化
dagger android 学习(四):基于dagger2的mvp架构

上篇文章讲述了,如果在baseActivity中调用inject方法实现依赖注入,但是这种需要重复的创建ActivityModule和ActivitySubcomponent类,好在dagger2提供了@ContributesAndroidInjector注解解决了这个问题,下面介绍如何使用@ContributesAndroidInjector注解。

首先所有的代码基于上篇文章中的demo来改,重复的东西就不在论述了。

改造方法

1、删除重复模板代码

删除之前demo中的MainActivitySubcomponent和MainActivityModule

2、创建BaseActivity类型的AndroidInjector实现接口

相比于之前的AndroidInjector,之前是基于具体的XXXActivity,这次则是BaseActivity

@Subcomponent(modules = [AndroidInjectionModule::class])
interface ActivityComponet: AndroidInjector<BaseActivity>{

    //每一个继承BaseActivity的Activity,都共享同一个SubComponent
    @Subcomponent.Builder
    abstract class Builder: AndroidInjector.Builder<BaseActivity>()
}

3、创建ActivityModule,管理所有Activity

新建一个ActivityModule类,管理所有Activity,并且加上@ContributesAndroidInjector注解即可。

@Module(subcomponents = [ActivityComponet::class])
abstract class ActivityModule{
    @ContributesAndroidInjector(modules = [ABModule::class])
    abstract fun mainActivityInjector(): MainActivity

    @ContributesAndroidInjector(modules = [ABModule::class])
    abstract fun main2ActivityInjector(): Main2Activity
}

3、修改MyAppComponent

删除之前的XXXActivityModule,替换为新的ActivityModule

@Component(modules = {
        AndroidInjectionModule.class,
        AndroidSupportInjectionModule.class,
        ActivityModule.class
})
public interface MyAppComponent {


    @Component.Builder
    interface Builder {
        MyAppComponent build();
    }


    void inject(MyApplication application);
}

总结

@ContributesAndroidInjector注解的功能其实就是直接帮我们重建了重复的模板代码,我们可以执行make project,之后我们便可以找到dagger自动创建的一个类ActivityModule_MainActivityInjector:

@Module(subcomponents = ActivityModule_MainActivityInjector.MainActivitySubcomponent.class)
public abstract class ActivityModule_MainActivityInjector {
  private ActivityModule_MainActivityInjector() {}

  @Binds
  @IntoMap
  @ClassKey(MainActivity.class)
  abstract AndroidInjector.Factory<?> bindAndroidInjectorFactory(
      MainActivitySubcomponent.Builder builder);

  @Subcomponent(modules = ABModule.class)
  public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
  }
}

很显然这个类和我们之前删去的类是一样的,这也就是为什么@ContributesAndroidInjector注解可以帮我们节省很多代码。
demo地址:查看项目中的app-version2模块