Kotlin + Dagger2:没有@Inject构造函数或@ Provide-或@ Produces-annotated方法不能提供

时间:2018-01-04 21:32:10

标签: android kotlin dagger-2 qualifiers

我收到以下错误:

  

错误:(8,1)错误:如果没有@Inject构造函数或@ Provide-或@ Produces-annotated方法,则无法提供java.lang.String。

我试图制作一个提供两个合格字符串的模块。这是匕首的简化设置。

@Singleton
@Component(modules = [GreetingsModule::class])
interface AppComponent {
    fun inject(activity: MainActivity)
}

@Qualifier annotation class Spanish
@Qualifier annotation class French
@Qualifier annotation class English

@Module
@Singleton
class GreetingsModule {

    @Provides
    @Spanish
    fun providesHola(): String = "Hola mundo! - From Dagger"

    @Provides
    @English
    fun providesHello(): String = "Hello world! - From Dagger"

}

注入在MainActivity中完成:

class MainActivity : AppCompatActivity() {

    @Inject @Spanish
    lateinit var holaMundoText: String

    @Inject @English
    lateinit var helloWorldText: String

}

我也尝试直接在组件中声明getter,但它失败并出现同样的错误。将模块方法声明为静态时也是如此。

正如应该的那样,代码只能使用一个@Provide,然后在两个字段中都会注入字符串。我认为问题在于限定符。

非常感谢任何帮助。

使用:

  • Android Studio 3.0.1
  • Kotlin 1.2.10
  • Dagger 2.14.1

2 个答案:

答案 0 :(得分:17)

JSR-330 + Kotlin(Dagger2就是这样的实现)有一些限定和命名注射的问题。从最近审查Github上Dagger2项目的积压工作开始,我知道Google团队正在寻求在即将发布的版本(无时间表)中提供更多主动帮助/更有用的错误消息。

您缺少的是@field:<Qualifier> annotation use-type targets,如链接文档中所述。所以试试;

@Inject @field:Spanish lateinit var holaMundoText: String

答案 1 :(得分:0)

我认为问题出在Kotlin编译器中,它不知道放置此类注释的位置(参数,设置器,字段等)。为了避免丑陋的@field:Spanish(西班牙注解类用Qualifier注解标记),我发现了另一种解决方案:只需在西班牙注解中加上带有适当参数的目标注解,即可参见示例:

@Qualifier
@Target(FUNCTION, CONSTRUCTOR, FIELD, VALUE_PARAMETER, PROPERTY_SETTER)
annotation class Spanish

然后您可以使用:

@Inject @Spanish
lateinit var holaMundoText: String