68 votes

Méthodes de fournisseur statique de poignard 2 dans kotlin

Avec les versions récentes de poignard 2 l'une des améliorations apportées sont la possibilité d'avoir statique de fournir des méthodes. Tout simplement:

@Provides
static A providesA() {
  return A();
}

Je me demandais comment fait-on pour faire cela dans kotlin? J'ai essayé

@Module
class AModule {
  companion object {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
  }
}

Mais je reçois le message d'erreur:

@Provides methods can only be present within a @Module or @ProducerModule

Je devine qu'il y a quelque chose qui se passe ici avec le compagnon de l'objet, mais je suis assez nouveau à Kotlin et je ne suis pas sûr de comment on peut faire cela. Est-il même possible?

Merci!

61voto

Omar Al Halabi Points 1395

Bien que la solution de zsmb13 soit meilleure, j’ai trouvé une autre solution qui fonctionne

 @Module
class AModule {
  @Module
  companion object {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
  }

  // add other non-static provides here
}
 

Cependant, notez qu'il y aura deux classes générées: AModule_ProvidesAFactory et AModule_Companion_ProvidesAFactory plutôt que la classe AModule_ProvidesAFactory pour le cas avec un objet au lieu d'une classe avec un objet compagnon

50voto

zsmb13 Points 36441

Je ne peux pas le tester pour l'instant, mais je pense que cela devrait fonctionner:

 @Module
object AModule {
    @JvmStatic
    @Provides
    fun providesA(): A = A()
}
 

18voto

sophia Points 99

Une grande explication de ce qui semble être de Google-est approuvé à https://github.com/google/dagger/issues/900

Plus précisément, voir:

Statique fournit peuvent être obtenus via @JvmStatic. Il y a deux scénarios, je vois ce sont en place:

niveau supérieur objects

@Module object DataModule {   
  @JvmStatic @Provides fun 
    provideDiskCache() = DiskCache() 
} 

Si vous avez une classe existante module de, les choses deviennent un peu plus bizarre

@Module abstract class DataModule {   
    @Binds abstract fun provideCache(diskCache: DiskCache): Cache

    @Module   
    companion object {
        @JvmStatic @Provides fun provideDiskCache() = DiskCache()   
    } 
} 

La façon dont cela fonctionne est la suivante:

le compagnon de l'objet doit également être annotées @Module sous le capot, le kotlin compilateur fera double emploi avec ceux statique fournit des méthodes en le DataModule classe. Poignard va voir ceux et de les traiter comme régulièrement des champs statiques. Poignard permettra également de voir dans le compagnon objet, mais que "module" permettra d'obtenir le code gen de poignard, mais être marqué comme "non utilisé". L'IDE marque ce en tant que tel, comme le provideDiskCache la méthode sera marqué comme non utilisés. Vous pouvez dire à l'Ide d'ignorer ce pour les annotations annotée avec @Fournit via quickfix

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X