2017-05-19 1 views
3

J'essaie d'utiliser le nouveau Dagger Android injection thing qui fonctionne jusqu'à maintenant.Le module doit être réglé

Maintenant je veux l'étendre à mes besoins.

Dans mon MainActivityModule j'ai ajouté un TestModule:

@Module 
abstract class MainActivityModule { 

    @ActivityScope 
    @ContributesAndroidInjector(modules = arrayOf(TestModule::class)) 
    internal abstract fun contributeMainActivityInjector(): MainActivity 
} 

Le TestModule est très simple:

@Module 
internal abstract class TestModule { 

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

Mais je reçois cette erreur: TestModule must be set

J'ai regardé dans le code source généré mais ne peux pas trouver un indice de ce que je dois faire. Je recherchais cela à Google, mais aussi trouvé que des exemples simples :-(

Qu'ai-je oublié? Vous pouvez trouver l'application complète à GitHub.

Modifier

Comme Jeff Bowman sayed le provideTest() doit être statique Lorsque je crée une classe Java comme ceci:..

@Module 
public class TestModule { 

    @Provides 
    static String provide() { 
     return "foo bar"; 
    } 
} 

cela fonctionne

Donc la dernière question: Comment faire cela à Kotlin? Cela ne fonctionne pas:

@Module 
internal abstract class TestModule { 

    companion object { 

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

J'ai donc besoin d'une autre méthode pour créer une méthode statique.

+0

En Java, vous vous attendez à ce que la méthode '@ Provides' soit statique, ce qui signifie que rien n'utilise une instance de' TestModule'. Cependant, [Kotlin ne supporte pas les méthodes statiques en tant que telles] (https://kotlinlang.org/docs/reference/classes.html#companion-objects). Je ne suis pas assez familier avec Kotlin pour fournir une vraie réponse, mais il semble que Dagger ait besoin d'une instance car 'provideTest' est non-statique, et ne croit pas pouvoir instancier TestModule via un constructeur public sans argument. –

Répondre

5

yeh J'ai trouvé une solution :-)

La manière d'obtenir une méthode static Kotlin est de mettre la méthode dans un companion object mais maintenant Dague renvoie une erreur que le @Provides ne peut être utilisé dans un @Module. Pour résoudre ce problème, j'annotés la companion object trop

@Module 
internal abstract class TestModule { 

    @Module 
    companion object { 

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

Une solution alternative, qui est un peu plus propre dans le cas où vous avez besoin de railler/remplacer les dépendances dans les tests, serait d'éviter de faire la classe abstraite, et de garder provides pas statique , comme ceci:

@Module 
internal class TestModule { 

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

}