84 votes

Poignard 2.2 composant du module générateur de méthode obsolète

J'ai commencé à l'aide de la dague à 2.2 et les méthodes de module dans le générateur de Composants sont obsolètes.

C'est mon composant de l'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;
    }
}

Ici est 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 le ComponentBuilder?

189voto

David Medenjak Points 4553

Vous devriez lire la description de pourquoi c'est déconseillé. Si vous utilisez un IDE comme IntelliJ ou Android Studio, vous pouvez simplement sélectionner la méthode et frappé de Contrôle + Q sur Windows pour lire la Javadoc, y compris la dépréciation de l'avis.

La Javadoc lit:

@deprecated Ce module est déclaré, mais une instance n'est pas utilisé dans le composant. Cette méthode est un no-op. Pour en savoir plus, voir https://google.github.io/dagger/unused-modules.

Et à partir de ce lien vous pouvez voir:

Lorsque le Poignard processeur génère des composants, il ne requiert que des instances de modules et de composants de dépendances qui sont explicitement nécessaires aux demandes d'approvisionnement pour une liaison.

  • Si tout d'un module de méthodes qui sont utilisées dans le composant sont statiques, la Dague n'a pas besoin d'une instance de ce module. Poignard peut invoquer les méthodes statiques directement sans module.
  • Si un module ne fournit aucune liaisons pour un Composant, aucune instance de ce module est nécessaire pour construire le graphe.

Il est sûr de dire que vous pouvez simplement ignorer l'autodérision. Il est destiné à vous informer de la partie inutilisée des méthodes et des modules. Dès que vous avez réellement besoin / utiliser Application quelque part dans votre sous-graphe le module va être nécessaire, et l'abandon d'avertissement va s'en aller.

54voto

saksham Points 750

Il montre obsolète parce que vous n'êtes pas à l'aide de Composant et module dans votre application par

@Inject
SomeObjectFromModule mSomeObject

si vous n'êtes pas l'injection de dépendances dans vos applications, il n'y a pas d'utilisation d'initialisation de votre composant afin de poignard chercher au moins un usage

une fois que vous ajoutez ces lignes dans toutes les classes que vous voulez injecter de vues et de nettoyer ensuite à construire et à reconstruire le projet et de votre retrait sera résolu

6voto

Phan Van Linh Points 16963

Il montre l'erreur quand mon Module n'ont aucun @Provides méthode ou l'objet que de fournir en Dagger n'est pas utilisé dans l'application.
Exemple pour supprimer obsolète module

Module

@Module
public class SecondActivityModule {
    @Provides
    Book provideBookTest() {
        return new Book();
    }
}

L'activité

public class SecondActivity extends AppCompatActivity {
    @Inject
    Book test;
    ...
}

OU en Composant

@Component(modules = SecondModule.class)
public interface SecondComponent {

    void inject(SecondActivity activity);

    Book getBookTest();
}

3voto

danhnn.uit Points 689

J'ai le même problème avec l'hôte et je veux juste tout le monde a déconseillé problème Généré le composant générateur de classe doit vérifier deux choses pour gagner du temps:

1/ Corriger poignard syntaxe pour le module, composant aussi vérifier soigneusement l'endroit où vous injecter.

2/ Doit avoir l'objet d'injection (injection d'annotation et de son objet) dans le lieu que vous voulez injecter ou d'autre le poignard compilateur ne peut pas voir où utiliser votre module de sorte que certains de la méthode sera obsolète.Juste injecter au moins un module à votre injection de place et de re-compiler le code, vous n'aurez pas ce problème de plus :)

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