2017-05-19 77 views
3

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

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

+0

在Java中,您会期望'@Processor'方法是静态的,这意味着什么都不使用TestModule实例。但是,[Kotlin不支持静态方法](https://kotlinlang.org/docs/reference/classes.html#companion-objects)。我不太了解Kotlin提供的真实答案,但似乎Dagger需要一个实例,因为'provideTest'是非静态的,并且不相信它可以通过公共无参数构造函数实例化TestModule。 –

回答

5

叶,我发现:-)

解决方案的科特林方式来获得一个static方法是把方法在companion object但现在匕首抛出了@Provides只能在@Module使用的错误。为了解决这个问题我诠释了companion object

@Module 
internal abstract class TestModule { 

    @Module 
    companion object { 

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

另一种解决方案,那就是万一有点清洁你需要模拟/在测试中替换关联,将避免使抽象类,并保持提供不静,如下所示:

@Module 
internal class TestModule { 

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

}