【问题标题】:Module must be set必须设置模块
【发布时间】:2017-05-19 17:31:25
【问题描述】:

我尝试使用目前有效的新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 找到完整的应用程序。

编辑

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

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

【问题讨论】:

  • 在 Java 中,您会期望 @Provides 方法是静态的,这意味着没有使用 TestModule 实例。但是,Kotlin doesn't support static methods as such。我对 Kotlin 不够熟悉,无法提供真正的答案,但似乎 Dagger 需要一个实例,因为 provideTest 是非静态的,并且不相信它可以通过公共无参数构造函数实例化 TestModule。

标签: android kotlin dagger-2


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 2018-01-03
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多