Vous êtes en train d’utiliser Dagger 2 puis à la compilation vous trouvez error: [Dagger/MissingBinding] cannot be provided without an @Provides-annotated method. Que faire pour le résoudre ?
Article sponsorisé par Zetaplus. Vous y trouverez des projets d’applications et des sites web créés par notre service dans notre portfolio.
L’ingénierie logiciel est un domaine qui comporte ses propres circonstances improbable. Si dans la théorie, l’architecture de l’application semble parfaite pour le projet, dans l’exécution, la qualité du produit dépend fortement du niveau technique du développeur. Surtout sur sa capacité à gérer les imprévisions , comme des bugs dont on ignore la solution.
Récemment dans le développement d’une application android très modulaire ( merci à notre superbe architecture ) nous avons rencontré un problème. Le projet étant centré sur l’utilisation du framework Dagger pour concevoir cet architecture, nous avons trouvé le message error: [Dagger/MissingBinding] cannot be provided without an @Provides-annotated method.
Après plusieurs recherches infructueuse sur internet, nous avons investigué à la force brute. Voici ce que nous avons trouvé.
Solution pour error: [Dagger/MissingBinding] cannot be provided without an @Provides-annotated method
Pour ce problème il existe plusieurs approches de solutions aussi différente les uns des autres. Nous allons donc pas les citer ici. La notre n’est pas évidente à trouver ailleurs, c’est pour ça on l’expose sur tedidev.com.
Supposons que nous avons deux sous – composants qui doivent construire des dépendances pour une activité ( que nous appelerons MainActivity ).
L’erreur se déclenche si les deux sous – composants construisent les dépendances pour le même type d’objet. Voici un exemple de deux composants susceptible de déclencher une erreur de compilation.
Sous composant A:
@Subcomponent(modules = [AModule::class]) interface AComponent { @Subcomponent.Factory interface Factory { fun create(): AComponent } fun inject(activity: MainActivity) // ligne jaune }
Sous composant B:
@Subcomponent(modules = [BModule::class]) interface BComponent { @Subcomponent.Factory interface Factory { fun create(): BComponent } fun inject(activity: MainActivity) // ligne jaune }
Au cas où vous stressez pour le langage, il s’agit de kotlin. Notre langage de développement de base.
Même si vous n’avez qu’injecter qu’un deux dans la classe MainActivity et que vous avez mis l’autre complètement à l’écart, l’erreur va simplement persister.
La solution est de supprimer l’un deux. Au mieux la méthode inject des deux composants doivent avoir des types paramètres complètement différents.
Ce genre de problème est si facile à éviter avec les tutoriels et les tests qu’il est difficile de réaliser que sur Dagger 2, une telle opération fait crasher le code source à la compilation.
Si je ne peux pas utiliser les deux composants que faire pour profiter des dépendances que j’ai construite dans une classe ?
La solution se trouve dans l’application des modules. Ils servent justement à ça.
Vous voulez utiliser les dépendances du composant A et B dans une classe pour profiter de leurs pleines puissances. Nous proposons de créer un composant C qui va utiliser le module de A et B. La solution ressemblerait à ça
Sous composant C:
@Subcomponent(modules = [AModule::class , BModule::class]) // ligne verte interface CComponent { @Subcomponent.Factory interface Factory { fun create(): CComponent } fun inject(activity: MainActivity) // ligne jaune }
Attention tout de même à la ligne jaune. Pensez changer ou supprimer la méthode inject ( en jaune ) dans les composants A et B.
On espère qu’on vous a aidé avec cet article. Etant aussi des êtres humains, nous pouvons nous tromper sur certaines points ou la compréhension même de l’erreur que nous somme en train de traiter. N’hésitez donc pas à nous écrire si vous avez d’autres propositions.
Si vous avez aimé ce post , n’hésitez pas à vous abonner à notre Newsletter pour avoir plus de contenus exclusifs et surtout profiter des bons plans.
Restons en contact !