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:
目标的注释,编译器现在将显示错误。您需要该目标,以便注释生效。
我有两个自定义注释
@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:
目标的注释,编译器现在将显示错误。您需要该目标,以便注释生效。