rx.Scheduler no se puede proporcionar sin un método @ Provides- o @ Produces-anotado

Tengo dos annotations personalizadas

@Qualifier @kotlin.annotation.Retention(AnnotationRetention.RUNTIME) annotation class IOScheduler 

y

 @Qualifier @kotlin.annotation.Retention(AnnotationRetention.RUNTIME) annotation class UIScheduler 

Los estoy usando en mi module

 @Module class UiModule { @Provides @UIScheduler fun provideUiScheduler(): Scheduler = AndroidSchedulers.mainThread() @Provides @IOScheduler fun provideIOScheduler(): Scheduler = Schedulers.io() } 

Por supuesto, el module se agrega a mi componente, y cuando bash inyectarlo, dice

rx.Scheduler no se puede proporcionar sin un método @ Provides- o @ Produces-anotado.

inyectar

 class MainPresenter(val view: MainContract.View) : MainContract.Presenter { @Inject lateinit var api: ApiServices @Inject lateinit var databaseManager: DatabaseManager @Inject @UIScheduler lateinit var observeScheduler: Scheduler @Inject @IOScheduler lateinit var subscribeScheduler: Scheduler ... } 

Es curioso pensar que estoy usando casi lo mismo con la inyección de Gson para mi ApiClient y funciona perfectamente

 @Module class ApiModule { ... @Provides @Singleton @DefaultGson fun providesGson(): Gson = GsonBuilder().create() @Provides @Singleton @FormatDateGson fun providesGsonFormatTimestamp(): Gson = GsonBuilder().setDateFormat(Constants.TIME_STAMP_FORMAT).create() } @Singleton class ApiClient @Inject constructor(@DefaultGson val gson: Gson, val shanetworkingPreferences: ShanetworkingPrefsUtils) { ... } 

Además, puedo decir que tengo la misma estructura de modules / proveedores en mis proyectos de Java y funciona muy bien.

Use annotations personalizadas con el field: objective, por ej.

 @Inject @field:IOScheduler lateinit var subscribeScheduler: Scheduler 

En otras noticias : Dagger se niega a hacer lo siguiente:

 @Inject internal var something: Boolean = false // or @Inject protected var toolbar: Toolbar? = null 

El error es así:

Dagger no admite inyección en campos privados

Esto afecta a cualquier variable sin el modificador lateinit .

Deberá exponer las primitivas en su componente e inyectarlas manualmente.

Solo especifique el set: objective, de modo que la inyección se realice a través de un public / internal / protected setter en lugar del campo de respaldo privado como este:

 @set:Inject internal var something: Boolean = false // or @set:Inject protected var toolbar: Toolbar? = null 

Anotaciones personalizadas

Declara tus annotations personalizadas con

 @Target(AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) 

– prácticamente cualquier cosa, excepto PROPERTY porque eso es invisible para Java. El comstackdor ahora mostrará un error si intenta usar una anotación sin get: set: o field: target. Y necesitas ese objective para que la anotación tenga efecto.

  • Datos de caching de request HTTP en RxJava
  • Kotlin - ¿Cómo crear una function de alias de RxJava flatmap ()?
  • Cómo consultar Realm en el background Subprocess usando RxJava2
  • RxJava Debounce onNext ()
  • El método de callback a menudo para reenviar el evento a Observable?
  • Pruebas unitarias Rxjava observables que tienen un retraso
  • No se puede hacer que la API invoque urlfetch.Fetch en un hilo que no sea el hilo de request original ni un hilo creado por ThreadManager
  • RxJava - ¿Entradas de keyboard de contrapresión?
  • Cómo fusionar 2 flujos separados, almacenar los datos rellenos y subscribirlos después de un time corto
  • Pausa / Reanudar un timer / retraso en RX
  • Combina Rx Singles en Observables recursivamente