gpt4 book ai didi

android - 如何使用 Dagger 2.10 Android Injector 提供与 @SessionScope 和 @ActivityScope 的依赖关系?

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:10 25 4
gpt4 key购买 nike

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

尽管依赖项通过@SessionScope提供,但我希望通过@ActivityScope提供依赖项,例如ActivityPresenter,当然,我必须将 @SessionScope@ActivityScope 的依赖项一起提供给 Activity 消费者类。

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

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

关于android - 如何使用 Dagger 2.10 Android Injector 提供与 @SessionScope 和 @ActivityScope 的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45808362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com