2017-05-19 115 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" 
    } 

}