【问题标题】:rx.Scheduler cannot be provided without an @Provides- or @Produces-annotated method如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供 rx.Scheduler
【发布时间】:2016-08-31 13:19:16
【问题描述】:

我确实有两个自定义注释

@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 不能在没有@Provides 的情况下提供- 或 @Produces-注解的方法。

注射

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

【问题讨论】:

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


    【解决方案1】:

    使用带有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: 目标,这样注入就可以通过公共/内部/受保护的设置器完成,而不是像这样的私有支持字段:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2019-02-26
      • 1970-01-01
      相关资源
      最近更新 更多