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

本系列博客主要用于本身学习积累,顺便帮助新手入门,若有问题,多多包涵。更详细的一些使用能够看看其余更加详细的博客。android

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

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

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

改造方法

一、删除重复模板代码

删除以前demo中的MainActivitySubcomponent和MainActivityModuleapp

二、建立BaseActivity类型的AndroidInjector实现接口

相比于以前的AndroidInjector,以前是基于具体的XXXActivity,此次则是BaseActivitypost

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

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

三、建立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
}
复制代码

三、修改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:ui

@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模块spa

相关文章
相关标签/搜索