I have a simple class as below
class MainString(val msg: String)
I want to inject with different argument to it, so I use the @Named<
Annotation work slightly different on kotlin. look this doc
You have to annotate the field as:
@Inject @field:Named("Two")
lateinit var stringOne: MainString
1) If you are using a qualifier like following, here 'OmdbService'
@Qualifier
public annotation class OmdbService
Then use
@Inject @field:OmdbService lateinit var retrofitOmdbService: Retrofit
2) If are using a named provider like following, here '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()
}
Then use
@Inject @field:Named("orangeservice_retrofit") lateinit var retrofitOrangeService: Retrofit
If you add the following to your qualifier annotation:
@Target(FIELD, VALUE_PARAMETER, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
then you won't have to add "field:"
For example, with:
@Qualifier
@Retention(RUNTIME)
@Target(FIELD, VALUE_PARAMETER, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
annotation class One
you can inject as follows:
@Inject @One lateinit var stringOne: String
Unfortunately @Named
doesn't specify the @Target(..)
, so just create your own annotations. @Named
is a bad idea anyway, since it's using string literals.