必须设置模块

Module must be set

我尝试使用目前有效的新 Dagger Android injection thing

现在我想扩展它以满足我的需要。

在我的 MainActivityModule I added a 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 class 时:

@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 只能用于 [=] 14=]。为了解决这个问题,我也注释了 companion object

@Module
internal abstract class TestModule {

    @Module
    companion object {

        @Provides
        @JvmStatic
        internal fun provideTest(): String {
            return "foo bar"
        }
    }
}

另一种解决方案更简洁,以防您需要在测试中模拟/替换依赖项,避免使 class 抽象化,并保持提供不是静态的,如下所示:

@Module
internal class TestModule {

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

}