rx.Scheduler 不能在没有 @Provides- 或 @Produces- 注释的方法的情况下提供

rx.Scheduler cannot be provided without an @Provides- or @Produces-annotated method

我有两个自定义注释

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

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

我在我的模块中使用它们

@Module
class UiModule {

    @Provides
    @UIScheduler
    fun provideUiScheduler(): Scheduler = AndroidSchedulers.mainThread()

    @Provides
    @IOScheduler
    fun provideIOScheduler(): Scheduler = Schedulers.io()

}

当然,模块已添加到我的组件中,当我尝试注入它们时,它说

rx.Scheduler cannot be provided without an @Provides- or @Produces-annotated method.

注射

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
  ...
}

有趣的是,我使用几乎相同的想法为我的 ApiClient 注入 Gson,并且它完美地工作

@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 sharedPreferences: SharedPrefsUtils) {
   ...
}

此外,我可以说我的 java 项目中确实有相同的模块/提供程序结构,并且工作正常。

field: 目标使用自定义注释,例如

@Inject @field:IOScheduler lateinit var subscribeScheduler: Scheduler

其他新闻:Dagger 拒绝执行以下操作:

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

错误如下所示:

Dagger does not support injection into private fields

这会影响任何没有 lateinit 修饰符的变量。

您必须在您的组件中公开原语并手动注入它们。

只需指定 set: 目标,以便通过 public/internal/protected setter 完成注入,而不是像这样的私有支持字段:

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

自定义注释

使用

声明您的自定义注释
@Target(AnnotationTarget.FIELD, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)

-- 除了 PROPERTY 几乎所有内容,因为 Java 不可见。如果您尝试使用不带 get:set:field: 目标的注释,编译器现在将显示错误。您需要该目标,以便注释生效。