如果没有@ Provide-或@ Produces-annotated方法,则无法提供rx.Scheduler

时间:2016-08-31 13:19:17

标签: 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()

}

当然模块被添加到我的组件中,当我试图注入它时,它说

  如果没有@ Provide-或,则无法提供rx.Scheduler   @ Produces-annotated方法。

注入

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项目中有相同的模块/提供者结构,它工作得很好。

1 个答案:

答案 0 :(得分:2)

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

@Inject @field:IOScheduler lateinit var subscribeScheduler: Scheduler

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

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

错误如下所示:

  

Dagger不支持注入私人领域

这会影响没有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:目标的注释,编译器现在会显示错误。并且您需要该目标以使注释生效。