在构造函数中仅注入某些参数
Inject only certain params in constructor
我有主持人
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.
有什么方法可以定义我想在构造函数中注入的参数吗?
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()
...
}
使用辅助构造函数注入构造函数
class PhonePresenter(
private val preference: DataPreference,
private val ioScheduler: Scheduler) {
@Inject constructor(preference: DataPreference) : this(preference, Schedulers.io())
}
我有主持人
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.
有什么方法可以定义我想在构造函数中注入的参数吗?
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()
...
}
使用辅助构造函数注入构造函数
class PhonePresenter(
private val preference: DataPreference,
private val ioScheduler: Scheduler) {
@Inject constructor(preference: DataPreference) : this(preference, Schedulers.io())
}