模块必须设置
我尝试使用到目前为止工作的新的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" } }