我有演示者
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.
有没有办法定义我想在构造函数中注入的参数?
答案 0 :(得分:3)
Dagger负责注射,让它做它的工作。不要使用默认参数(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
添加到您的组件中。
提供不同参数的正确方法是使用具有不同模块的不同组件,例如,用于检测。或者在测试时,您将手动调用构造函数。
或者,您可以从构造函数参数中删除IO调度程序。这些名字表明它永远不会是Schedulers.io()
以外的任何东西,所以将其参数化是没有意义的;把它变成一个实现细节。
class PhonePresenter @Inject constructor(private val preference: DataPreference) {
private val ioScheduler = Schedulers.io()
...
}
答案 1 :(得分:3)
使用辅助构造函数
创建注入构造函数{{1}}