J'ai commencé à utiliser Dagger 2.2 et les méthodes de module du générateur de composants sont obsolètes.
Ceci est mon composant d'application:
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
void inject(Application application);
}
Et le module d'application:
@Module
public class ApplicationModule {
Application application;
public ApplicationModule(Application application) {
this.application = application;
}
@Provides
@Singleton
Application providesApplication() {
return application;
}
}
Voici la classe générée:
@Generated(
value = "dagger.internal.codegen.ComponentProcessor",
comments = "https://google.github.io/dagger"
)
public final class DaggerApplicationComponent implements ApplicationComponent {
private DaggerApplicationComponent(Builder builder) {
assert builder != null;
}
public static Builder builder() {
return new Builder();
}
public static ApplicationComponent create() {
return builder().build();
}
@Override
public void inject(Application application) {
MembersInjectors.<Application>noOp().injectMembers(application);
}
public static final class Builder {
private Builder() {}
public ApplicationComponent build() {
return new DaggerApplicationComponent(this);
}
/**
* @deprecated This module is declared, but an instance is not used in the component. This method is a no-op. For more, see https://google.github.io/dagger/unused-modules.
*/
@Deprecated
public Builder applicationModule(ApplicationModule applicationModule) {
Preconditions.checkNotNull(applicationModule);
return this;
}
}
}
Comment initialiser le composant si ce n'est avec ComponentBuilder?
Vous devriez lire la description de pourquoi il est obsolète. Si vous utilisez un IDE comme IntelliJ ou Android Studio, vous pouvez simplement sélectionner la méthode et appuyer sur Control + Q sous Windows pour lire la Javadoc, y compris l’avis de dépréciation.
La Javadoc se lit comme suit:
@deprecated Ce module est déclaré, mais aucune instance n'est utilisée dans le composant. Cette méthode est un non-op. Pour plus d'informations, voir https://google.github.io/dagger/unused-modules .
Et à partir de ce lien, vous pouvez voir:
Lorsque le processeur Dagger génère des composants, il ne nécessite que des instances de modules et des dépendances de composants explicitement nécessaires pour fournir des demandes de liaison.
- Si toutes les méthodes d'un module utilisées dans le composant sont statiques, Dagger n'a pas du tout besoin d'une instance de ce module. Dagger peut invoquer les méthodes statiques directement sans module.
- Si un module ne fournit aucune liaison pour un composant, aucune instance de ce module n'est nécessaire pour construire le graphique.
Il est prudent de dire que vous pouvez simplement ignorer la dépréciation. Il est destiné à vous informer des méthodes et des modules inutilisés. Dès que vous aurez réellement besoin de/utilisez Application
quelque part dans votre sous-graphique, le module sera nécessaire et l'avertissement de dépréciation disparaîtra.
Il montre obsolète parce que vous n'utilisez pas Component et module dans votre application en
@Inject
SomeObjectFromModule mSomeObject
si vous n'injectez pas de dépendances dans vos applications, il n'est pas utile d'initialiser votre composant, donc le poignard recherche au moins une utilisation.
une fois que vous avez ajouté ces lignes dans les classes pour lesquelles vous souhaitez injecter des vues, puis créer, reconstruire et reconstruire le projet, votre dépréciation sera résolue.
Cela montre une erreur lorsque mon Module
n'a pas de @Provides
La méthode ou l'objet fourni par Dagger
n'est pas utilisé dans l'application.
Exemple pour supprimer un module obsolète
Module
@Module
public class SecondActivityModule {
@Provides
Book provideBookTest() {
return new Book();
}
}
Activité
public class SecondActivity extends AppCompatActivity {
@Inject
Book test;
...
}
OU dans le composant
@Component(modules = SecondModule.class)
public interface SecondComponent {
void inject(SecondActivity activity);
Book getBookTest();
}
J'ai le même problème avec Host et je veux simplement que tout le monde ait un problème obsolète dans la classe du générateur de composant généré doit vérifier deux choses pour gagner du temps:
1/Corrigez la syntaxe du poignard pour le module, composant également vérifier soigneusement où vous injectez.
2/Vous devez avoir un objet d’injection (annotation et son objet) à la place que vous voulez injecter, sinon le compilateur de dagues ne peut pas savoir où utiliser votre module; une méthode sera donc déconseillée. recompilez le code, vous n'aurez plus ce problème :)