仅在构造函数中注入某些参数

时间:2017-12-24 14:22:50

标签: android kotlin dagger-2 dagger

我有演示者

class PhonePresenter @Inject constructor(
    private val preference: DataPreference,
    private val ioScheduler: Scheduler = Schedulers.io())

ioScheduler是默认参数。我想只注入preference: DataPreference。现在我有例外

[dagger.android.AndroidInjector.inject(T)] io.reactivex.Scheduler cannot be provided without an @Provides-annotated method.

有没有办法定义我想在构造函数中注入的参数?

2 个答案:

答案 0 :(得分:3)

Dagger负责注射,让它做它的工作。不要使用默认参数(Dagger不关心),这将迫使您做出有关依赖关系的有力决策。

我想到了两种方法:

1。使用Dagger注入

创建限定符,以便Dagger可以区分您可能要注入的调度程序类型和提供默认IO调度程序的模块。

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@MustBeDocumented
annotation class ForIo

@Module
class SchedulerModule {
     @Provides @ForIo
     fun provideIoScheduler() : Scheduler = Schedulers.io()
}

class PhonePresenter @Inject constructor(
    private val preference: DataPreference,
    @ForIo private val ioScheduler: Scheduler
) { ... }

照常将SchedulerModule添加到您的组件中。

提供不同参数的正确方法是使用具有不同模块的不同组件,例如,用于检测。或者在测试时,您将手动调用构造函数。

2。在这种情况下避免使用Dagger

或者,您可以从构造函数参数中删除IO调度程序。这些名字表明它永远不会是Schedulers.io()以外的任何东西,所以将其参数化是没有意义的;把它变成一个实现细节。

class PhonePresenter @Inject constructor(private val preference: DataPreference) { 
    private val ioScheduler = Schedulers.io()

    ... 
}

答案 1 :(得分:3)

使用辅助构造函数

创建注入构造函数
{{1}}