我尝试使用迄今为止有用的新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找到完整的应用。
修改
正如杰夫鲍曼所说,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"
}
}
}
所以我需要另一种方法来创建静态方法。
答案 0 :(得分:5)
Kotlin获取static
方法的方法是将方法放在companion object
中,但现在Dagger会抛出一个错误,@Provides
只能在@Module
中使用}。为了解决这个问题,我也注释了companion object
@Module
internal abstract class TestModule {
@Module
companion object {
@Provides
@JvmStatic
internal fun provideTest(): String {
return "foo bar"
}
}
}
答案 1 :(得分:0)
另一种解决方案,如果你需要在测试中模拟/替换依赖项,那就更清晰一点,就是避免使类抽象化,并保持提供不是静态的,如下所示:
{{1}}