Dagger 在 android 中的使用

2020-05-17  本文已影响0人  夏日之暮

依赖

@Component@Module@Subcomponent 之间的关系

Dagger 生成代码

dagger_generated_code.png

Dagger For Android

使用方法

总共有 4 个步骤

  1. Application 类实现 HasAndroidInjector接口:

    class MyApplication: Application(), HasAndroidInjector{
    
        @Inject
        lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>
    
        override fun androidInjector(): AndroidInjector<Any> {
            return dispatchingAndroidInjector;
        }
    
        override fun onCreate() {
            super.onCreate()
            DaggerApplicationComponent.create().inject(this)
        }
    }
    
  2. Component include 内置的 AndroidInjectionModule

    @Component(modules = [AndroidInjectionModule::class, ...]) 
        interface ApplicationComponent {
        ...
    }
    
  3. Activity 定义一个 Subcomponent:

  @Subcomponent
  interface LoginComponent2: AndroidInjector<LoginActivity> {
  
      @Subcomponent.Factory
      interface Factory: AndroidInjector.Factory<LoginActivity> {}
  }

  @Module(subcomponents = [LoginComponent2::class])
  abstract class LoginModule2{
  
      @Binds
      @IntoMap
      @ClassKey(LoginActivity::class)
      abstract fun provideLoginComponent2Factory(f: LoginComponent2.Factory): AndroidInjector.Factory<*>
  }
  1. LoginModule2 include 到 Component中后,就可以在 BaseActivity 中注入它的子类了:

    abstract class BaseActivity: Activity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            AndroidInjection.inject(this)
            super.onCreate(savedInstanceState)
        }
    }
    

    以后新加的 Activity ,只要它继承 BaseActivity , 并定义好它自己的 SubcomponentModule ,就可以实现依赖的自动注入了;

第 3 步骤,给每个 Activity 定义 SubcomponentModule 还是比较繁琐的,用 @ContributesAndroidInjector 就可以让 Dagger 自动为我们生成 SubcomponentModule:

@Module
abstract class ActivityModule {
    
    @ContributesAndroidInjector
    abstract fun loginActivity(): LoginActivity
}

Dagger 会生成如下代码(基本和手动写的差不多)

@Module(subcomponents = ActivityModule_LoginActivity.LoginActivitySubcomponent.class)
public abstract class ActivityModule_LoginActivity {
  private ActivityModule_LoginActivity() {}
    
  @Binds
  @IntoMap
  @ClassKey(LoginActivity.class)
  abstract AndroidInjector.Factory<?> bindAndroidInjectorFactory(
      LoginActivitySubcomponent.Factory builder);
    
  @Subcomponent
  public interface LoginActivitySubcomponent extends AndroidInjector<LoginActivity> {
    @Subcomponent.Factory
    interface Factory extends AndroidInjector.Factory<LoginActivity> {}
  }
}
原理
使用过程注意点

Disadvantages of Dagger

学习资料

上一篇 下一篇

猜你喜欢

热点阅读