必须设置模块

时间:2017-05-19 17:31:26

标签: android kotlin dagger-2

我尝试使用迄今为止有用的新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"
        }
    }
}

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

2 个答案:

答案 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}}