Dagger2预选赛没有与Kotlin合作?

问题描述 投票:7回答:3

我有一个简单的课程如下

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")
}

我做错了什么?

android kotlin dagger-2
3个回答
19
投票

kotlin上的注释工作略有不同。看看this doc

您必须将该字段注释为:

@Inject @field:Named("Two")
lateinit var stringOne: MainString

3
投票

如果将以下内容添加到限定符注释中:

@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是一个坏主意,因为它使用字符串文字。


0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.