我有两个自定义注释
@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项目中有相同的模块/提供者结构,它工作得很好。
答案 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:
目标的注释,编译器现在会显示错误。并且您需要该目标以使注释生效。