Android Dagger2限定符不适用于Kotlin?
我有一个简单的类如下Android Dagger2限定符不适用于Kotlin?,android,kotlin,dagger-2,Android,Kotlin,Dagger 2,我有一个简单的类如下 class MainString(val msg: String) 我想向它注入不同的参数,因此我使用@Named限定符,如中所示 有了它,我的AppModule @Provides @Named("Two") fun provideTwoMainString(): MainString { return MainString("Two") } @Provides @Named("One") fun provideOneMainString(): MainStr
class MainString(val msg: String)
我想向它注入不同的参数,因此我使用@Named
限定符,如中所示
有了它,我的AppModule
@Provides @Named("Two")
fun provideTwoMainString(): MainString {
return MainString("Two")
}
@Provides @Named("One")
fun provideOneMainString(): MainString {
return MainString("One")
}
在我的主要活动中,我只是打电话
@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上的注释工作略有不同。看 必须将字段注释为:
@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\u改装”
@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