【发布时间】:2017-05-19 17:31:25
【问题描述】:
我尝试使用目前有效的新Dagger Android injection thing。
现在我想将它扩展到我的需要。
在我的MainActivityModule 中我添加了一个TestModule:
@Module
abstract class MainActivityModule {
@ActivityScope
@ContributesAndroidInjector(modules = arrayOf(TestModule::class))
internal abstract fun contributeMainActivityInjector(): MainActivity
}
TestModule 真的很简单:
@Module
internal abstract class TestModule {
@Provides
internal fun provideTest(): String {
return "foo bar"
}
}
但我收到此错误:TestModule must be set
我查看了生成的源代码,但找不到我必须做什么的提示。我也在谷歌上搜索过,但只找到了简单的例子:-(
我忘记了什么?您可以在GitHub 找到完整的应用程序。
编辑
正如 Jeff Bowman 所说,provideTest() 必须是静态的。当我创建这样的 Java 类时:
@Module
public class TestModule {
@Provides
static String provide() {
return "foo bar";
}
}
它有效。
所以最后一个问题:如何在 Kotlin 中制作这个?这不起作用:
@Module
internal abstract class TestModule {
companion object {
@Provides
@JvmStatic
internal fun provideTest(): String {
return "foo bar"
}
}
}
所以我需要另一种方法来创建静态方法。
【问题讨论】:
-
在 Java 中,您会期望
@Provides方法是静态的,这意味着没有使用TestModule实例。但是,Kotlin doesn't support static methods as such。我对 Kotlin 不够熟悉,无法提供真正的答案,但似乎 Dagger 需要一个实例,因为provideTest是非静态的,并且不相信它可以通过公共无参数构造函数实例化 TestModule。