我有一个简单的课程如下
class MainString(val msg: String)
我想注入不同的参数,所以我按照@Named
中的指南使用https://google.github.io/dagger/users-guide限定符
有了我的AppModule
@Provides @Named("Two")
fun provideTwoMainString(): MainString {
return MainString("Two")
}
@Provides @Named("One")
fun provideOneMainString(): MainString {
return MainString("One")
}
在我的MainActivity中,我只是打电话
@Inject @Named("One")
lateinit var stringOne: MainString
@Inject @Named("Two")
lateinit var stringTwo: MainString
但是,当我编译时,它会抱怨
Error:(11, 1) error: com.elyeproj.demo_dagger_scope.MainString cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
它似乎要我提供另一个没有限定符的提供者。因此,如果我添加以下内容,则所有内容都将编译。但它并不适合我,因为我希望有不同的参数注入。
@Provides
fun provideMainString(): MainString {
return MainString("Solo")
}
我做错了什么?
kotlin上的注释工作略有不同。看看this doc
您必须将该字段注释为:
@Inject @field:Named("Two")
lateinit var stringOne: MainString
如果将以下内容添加到限定符注释中:
@Target(FIELD, VALUE_PARAMETER, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
那么你将不必添加“字段:”
例如,用:
@Qualifier
@Retention(RUNTIME)
@Target(FIELD, VALUE_PARAMETER, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
annotation class One
你可以注入如下:
@Inject @One lateinit var stringOne: String
不幸的是@Named
没有指定@Target(..)
,所以只需创建自己的注释。无论如何,@Named
是一个坏主意,因为它使用字符串文字。
1)如果你正在使用如下的限定符,那么'OmdbService'
@Qualifier
public annotation class OmdbService
然后用
@Inject @field:OmdbService lateinit var retrofitOmdbService: Retrofit
2)如果使用如下所示的命名提供者,请在此处'orangeservice_retrofit'
@Provides
@OrangeApplicationScope
@Named("orangeservice_retrofit")
fun retrofit(okHttpClient :OkHttpClient, gson : Gson, c :Context): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient)
.baseUrl(c.getString(R.string.base_url))
.build()
}
然后用
@Inject @field:Named("orangeservice_retrofit") lateinit var retrofitOrangeService: Retrofit