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