Вложить только определенные параметры в конструктор

У меня есть ведущий

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

ioScheduler – это параметр по умолчанию. Я хочу preference: DataPreference только preference: DataPreference . Теперь у меня есть исключение

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

Есть ли способ определить параметры, которые я хочу вставить в конструктор?

Создайте конструктор инжекции со вспомогательным конструктором

 class PhonePresenter( private val preference: DataPreference, private val ioScheduler: Scheduler) { @Inject consturctor(preference: DataPreference):this(perference, Schedulers.io()) } 

Кинжал отвечает за инъекцию, пусть это делает работу. Не используйте параметры по умолчанию (Кинжал не волнует), это заставит вас принимать убедительные решения относительно ваших зависимостей.

Приходят два подхода:

1. Используйте Кинжал для инъекций

Создайте квалификатор, чтобы Кинжал мог различать типы планировщиков, которые вы, возможно, захотите ввести, и модуль, который предоставляет планировщик ввода-вывода по умолчанию.

 @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. Избегайте кинжала в этом случае

В качестве альтернативы вы можете удалить планировщик ввода-вывода из параметров конструктора. Названия предполагают, что это никогда не будет чем-то иным, чем Schedulers.io() поэтому нет смысла его параметризовать; вместо этого сделайте его частью реализации.

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