Dagger2 Qualifier not working with Kotlin?

后端 未结 3 951
独厮守ぢ
独厮守ぢ 2020-12-17 19:24

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<

相关标签:
3条回答
  • 2020-12-17 19:45

    Annotation work slightly different on kotlin. look this doc

    You have to annotate the field as:

    @Inject @field:Named("Two")
    lateinit var stringOne: MainString
    
    0 讨论(0)
  • 2020-12-17 19:52

    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
    
    0 讨论(0)
  • 2020-12-17 19:54

    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.

    0 讨论(0)
提交回复
热议问题