Die Modulmethode von Dagger 2.2 Component Builder ist veraltet


81

Ich habe angefangen, Dolch 2.2 zu verwenden, und die Modulmethoden im Builder für Komponenten sind veraltet.

Dies ist meine Anwendungskomponente:

@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    void inject(Application application);
}

Und das Anwendungsmodul:

@Module
public class ApplicationModule {
    Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Application providesApplication() {
        return application;
    }
}

Hier ist die generierte Klasse:

@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;
    }
  }
}

Wie initialisiere ich die Komponente, wenn nicht mit dem ComponentBuilder?

Antworten:


180

Sie sollten die Beschreibung lesen, warum es veraltet ist. Wenn Sie eine IDE wie IntelliJ oder Android Studio verwenden, können Sie einfach die Methode auswählen und unter Windows Control+ Qdrücken, um das Javadoc einschließlich des Verfallshinweises zu lesen.

Der Javadoc liest:

@deprecated Dieses Modul ist deklariert, aber eine Instanz wird in der Komponente nicht verwendet. Diese Methode ist ein No-Op. Weitere Informationen finden Sie unter https://google.github.io/dagger/unused-modules .

Und unter diesem Link können Sie sehen:

Wenn der Dolchprozessor Komponenten generiert, sind nur Instanzen von Modulen und Komponentenabhängigkeiten erforderlich, die explizit benötigt werden, um Anforderungen für eine Bindung bereitzustellen.

  • Wenn alle in der Komponente verwendeten Methoden eines Moduls statisch sind, benötigt Dagger überhaupt keine Instanz dieses Moduls. Dolch kann die statischen Methoden direkt ohne Modul aufrufen.
  • Wenn ein Modul keine Bindungen für eine Komponente bereitstellt, ist keine Instanz dieses Moduls erforderlich, um das Diagramm zu erstellen.

Man kann mit Sicherheit sagen, dass Sie die Ablehnung einfach ignorieren können. Es soll Sie über nicht verwendete Methoden und Module informieren. Sobald Sie tatsächlich Applicationirgendwo in Ihrem Untergraphen benötigen / verwenden, wird das Modul benötigt und die Warnung vor der Nichtbeachtung verschwindet.


73
Antwort scannen, Befehlstaste + Q drücken, Android Studio wird heruntergefahren. Schalten Sie das Gehirn ein, kommen Sie zurück und lesen Sie die Antwort erneut.
Bri6ko

4
Strg + J übrigens. Strg + Q ist ein Trolling-Versuch.
StarWind0

4
@ StarWind Kein Trolling beabsichtigt, dies ist die Windows-Verknüpfung;)
David Medenjak

2
Verstehe wirklich nicht, warum diese Antwort am besten ist?
Sever

2
@Sever Genau, der Javadoc sagt alles. Es sind nur einige Informationen zu redundanten Teilen, und wie am Ende angegeben, können Sie sie einfach ignorieren. Es verschwindet, sobald Sie Code hinzufügen, der das Modul verwendet.
David Medenjak

49

Es wird als veraltet angezeigt, da Sie Component und Modul in Ihrer Anwendung von nicht verwenden

@Inject
SomeObjectFromModule mSomeObject

Wenn Sie keine Abhängigkeiten in Ihre Anwendungen einfügen, können Sie Ihre Komponente nicht initialisieren. Suchen Sie daher nach mindestens einer Verwendung

Sobald Sie diese Zeilen in einer beliebigen Klasse hinzufügen, möchten Sie Ansichten einfügen und dann das Projekt sauber erstellen und neu erstellen, und Ihre Ablehnung wird behoben


5
Es sollte die akzeptierte Antwort sein. Vergessen Sie außerdem nicht, nach der Injektion "Ihr Projekt neu zu erstellen".
sokarcreative

4

Es zeigt Fehler an, wenn ich Modulekeine @ProvidesMethode habe oder das Objekt, das von bereitstellt, Daggernicht in der App verwendet wird.
Beispiel zum Entfernen eines veralteten Moduls

Modul

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

Aktivität

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

ODER in Komponente

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

    void inject(SecondActivity activity);

    Book getBookTest();
}

3

Ich habe das gleiche Problem mit dem Host und ich möchte nur, dass jeder ein veraltetes Problem mit der Builder-Klasse für generierte Komponenten hat. Sie sollten zwei Dinge überprüfen, um Zeit zu sparen:

1 / Korrigieren Sie die Dolchsyntax für das Modul. Überprüfen Sie auch sorgfältig, wo Sie injizieren.

2 / Das Injektionsobjekt (Inject Annotation und sein Objekt) muss an der Stelle sein, an der Sie injizieren möchten. Andernfalls kann der Dolch-Compiler nicht sehen, wo Ihr Modul verwendet werden soll, sodass eine Methode veraltet ist Kompiliere den Code neu, du wirst dieses Problem nicht mehr haben :)


1

Wenn Sie void inject(AppCompactActivity activity);in der Komponentenklasse deklarieren, wird die Modulmethode veraltet . Anstatt wie folgt eine enge Kopplung zu verwenden void inject(MainActivity activity);und Ihr Projekt neu zu erstellen, gibt es in der Modulklasse keine veraltete Methode

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.