web-dev-qa-db-fra.com

Méthode de module de générateur de composant Dagger 2.2 obsolète

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?

71
user1940676

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.

161
David Medenjak

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.

41
saksham

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();
}
4
Phan Van Linh

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 :)

3
danhnn.uit