android - 如果没有 @Provides 或 @Produces 注释的方法,则无法提供 rx.Scheduler

标签 android rx-java kotlin dagger-2 rx-android

我有两个自定义注释

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

}

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

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

注入(inject)

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 注入(inject) 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 修饰符的变量。

您必须在组件中公开基元并手动注入(inject)它们。

只需指定 set: 目标,以便通过公共(public)/内部/ protected setter 完成注入(inject),而不是像这样的私有(private)支持字段:

@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: 目标的注释,编译器现在将显示错误。您需要该目标才能使注释生效。

关于android - 如果没有 @Provides 或 @Produces 注释的方法,则无法提供 rx.Scheduler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39250777/

相关文章:

android - 需要在 PhoneStateListener 中调用一个 Activity

android - createRfcommSocketToServiceRecord 配对蓝牙

java - 使用 RxJava 对状态重复操作

rx-java - RxJava 链接 observables 和错误处理(自定义异常传播)

kotlin - 自动订阅Rx流中的可观察对象

kotlin - 你能在 Kotlin 的 stringRequest 变量之外获取 Volley 的响应数据吗?

android - subview 不固定父形状

java - 如何使 Toast 中的 2 行文本彼此居中?

android - 如何在 Android 中保存和恢复 lambda?

android - DaggerAppComponent - Unresolved reference