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

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())
}