Kotlin + Dagger2:不能在没有@Inject 构造函数或@Provides- 或@Produces-注释方法的情况下提供
Kotlin + Dagger2: cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method
我收到以下错误:
Error:(8, 1) error: java.lang.String cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
我一直在尝试制作一个提供两个合格字符串的模块。这是匕首的简化设置。
@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
- 科特林 1.2.10
- 匕首 2.14.1
使用 JSR-330 + Kotlin(Dagger2 是其实现)的限定和命名注入有一些问题。通过最近在 Github 上审查 Dagger2 项目的积压,我知道 Google 团队希望在即将发布的版本(无时间尺度)中提供更主动的 assistance/more 有用的错误消息。
您缺少的是链接文档中描述的 @field:<Qualifier>
annotation use-type targets。所以试试看;
@Inject @field:Spanish lateinit var holaMundoText: String
我认为问题出在 Kotlin 编译器中,它不知道放置此类注释的位置(参数、setter、字段等)。为了避免丑陋的 @field:Spanish
(西班牙语注释 class 被标记为 Qualifier 注释)我找到了另一个解决方案:只需使用带有适当参数的 Target 注释标记西班牙语注释,参见示例:
@Qualifier
@Target(FUNCTION, CONSTRUCTOR, FIELD, VALUE_PARAMETER, PROPERTY_SETTER)
annotation class Spanish
那么你可以使用:
@Inject @Spanish
lateinit var holaMundoText: String
我收到以下错误:
Error:(8, 1) error: java.lang.String cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
我一直在尝试制作一个提供两个合格字符串的模块。这是匕首的简化设置。
@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
- 科特林 1.2.10
- 匕首 2.14.1
使用 JSR-330 + Kotlin(Dagger2 是其实现)的限定和命名注入有一些问题。通过最近在 Github 上审查 Dagger2 项目的积压,我知道 Google 团队希望在即将发布的版本(无时间尺度)中提供更主动的 assistance/more 有用的错误消息。
您缺少的是链接文档中描述的 @field:<Qualifier>
annotation use-type targets。所以试试看;
@Inject @field:Spanish lateinit var holaMundoText: String
我认为问题出在 Kotlin 编译器中,它不知道放置此类注释的位置(参数、setter、字段等)。为了避免丑陋的 @field:Spanish
(西班牙语注释 class 被标记为 Qualifier 注释)我找到了另一个解决方案:只需使用带有适当参数的 Target 注释标记西班牙语注释,参见示例:
@Qualifier
@Target(FUNCTION, CONSTRUCTOR, FIELD, VALUE_PARAMETER, PROPERTY_SETTER)
annotation class Spanish
那么你可以使用:
@Inject @Spanish
lateinit var holaMundoText: String