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