如何使用 Dagger 2.10 Android 注入器提供与 @SessionScope 和 @ActivityScope 的依赖关系?

How to provide a dependency with @SessionScope and @ActivityScope using Dagger 2.10 Android Injector?

假设您有一个应用程序,用户在第一个屏幕上登录,从那一刻起,您可以访问一个 User 对象。我想在 @SessionScope 下提供此依赖项 - 这意味着,当用户注销时,通过注释为 @SessionScope 的组件提供的所有依赖项都会消失。

尽管依赖项通过 @SessionScope 提供,但我希望通过 @ActivityScope 提供依赖项,例如 ActivityPresenter,当然,我必须提供来自 @SessionScope@ActivityScope 一起到 Activity 消费者 class.

使用 Dagger 2 的新 AndroidInjector 功能最好的做法是什么?

到目前为止,我能够在 @ActivityScope 下提供依赖项,如下所示:

@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class ActivityScope

@Module
abstract class ActivitiesBuilder {

    @ActivityScope
    @ContributesAndroidInjector(modules = arrayOf(HomepageModule::class, FacebookModule::class))
    abstract fun providesHomepageViewImpl(): HomepageViewImpl

}

@Module
abstract class AppModule {

    @Provides
    @Singleton
    fun provides (application: Application) : Context = application

}

@Singleton
@Component(
        modules = arrayOf(
                AndroidInjectionModule::class,
                ActivitiesBuilder::class,
                AppModule::class
        )
)
interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    abstract class Builder : AndroidInjector.Builder<App>()

}

class App : DaggerApplication() {

    override fun onCreate() {
        super.onCreate()
        Timber.plant(Timber.DebugTree())
    }

    override fun applicationInjector(): AndroidInjector<out DaggerApplication> = DaggerAppComponent.builder().create(this)
}

教程

  1. 创建一个名为 @SessionScope 的自定义作用域;
  2. 创建一个名为 SessionActivityBinding 的 class:
    • 添加一个方法来绑定将在会话范围内提供的 activity 子组件 - 可以找到有关此实现的更多详细信息 here;
  3. 创建一个名为 SessionComponent 的子组件:
    • 使用在步骤 1 中创建的自定义范围注释此子组件;
    • 创建一个 @Subcomponent.Builder 并添加一个接收 User 对象作为参数的方法;
      • @BindsInstance 注释此方法;
      • 添加此方法 fun build(): SessionComponent 以允许提供此 SessionComponent - 这是必要的,以便在用户注销时释放此组件;
    • SessionActivityBinding class添加到模块数组中;
    • [OPTIONAL]: 添加一个SessionModule class来提供@SessionScope下应该提供的依赖;
  4. AppModule 添加 SessionComponent 作为子组件;
  5. 在来自 AppComponent 的模块列表中添加 AppModule
  6. 当用户成功通过系统身份验证并获取用户对象时,创建 SessionComponent 的实例,该实例必须保持活动状态直到用户注销;
  7. 每当用户注销时,丢弃 SessionComponent 的旧实例,例如:sessionComponent = null - 这将丢弃在 @SessionScope;
  8. 下提供的所有依赖项
  9. 每当用户再次登录时,从第 6 步开始重复该过程;

可以找到更多详细信息和示例 here;