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

相關文章
相關標籤/搜索