模块必须设置

我尝试使用到目前为止工作的新的Dagger Android注入的东西 。

现在我想扩展到我的需求。

在我的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

我看着生成的源代码,但无法找到我必须做的提示。 我也在Google搜索了这个,但是只找到了简单的例子:-(

我忘了什么 你可以在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" } } } 

所以我需要另一种方法来创建一个静态方法。

是的,我找到了一个解决方案:-)

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

另一种解决方案,如果你需要模拟/替换测试中的依赖关系,那么这个方法会更简洁一些,就是避免让类抽象化,并且保持提供的不是静态的,如下所示:

 @Module internal class TestModule { @Provides internal fun provideTest(): String { return "foo bar" } }