Metoda modułu budowania komponentów Daggera 2.2 jest przestarzała

81

Zacząłem używać daggera 2.2, a metody modułów w konstruktorze komponentów są przestarzałe.

To jest mój składnik aplikacji:

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

Oraz moduł aplikacji:

@Module
public class ApplicationModule {
    Application application;

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

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

Oto wygenerowana klasa:

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

Jak zainicjować składnik, jeśli nie za pomocą ComponentBuilder?

user1940676
źródło

Odpowiedzi:

181

Przeczytaj opis, dlaczego jest przestarzały. Jeśli używasz IDE, takiego jak IntelliJ lub Android Studio, możesz po prostu wybrać metodę i nacisnąć Control+ Qw systemie Windows, aby przeczytać Javadoc, w tym powiadomienie o wycofaniu.

Javadoc czyta:

@deprecated Ten moduł jest zadeklarowany, ale jego instancja nie jest używana. Ta metoda nie działa. Więcej informacji znajdziesz na https://google.github.io/dagger/unused-modules .

A z tego linku możesz zobaczyć:

Kiedy procesor Dagger generuje komponenty, wymaga tylko wystąpień modułów i zależności komponentów, które są jawnie potrzebne do dostarczania żądań powiązania.

  • Jeśli wszystkie metody modułu używane w komponencie są statyczne, Dagger w ogóle nie potrzebuje instancji tego modułu. Dagger może wywoływać statyczne metody bezpośrednio bez modułu.
  • Jeśli moduł nie zapewnia żadnych powiązań dla składnika, do skonstruowania wykresu nie jest potrzebne żadne wystąpienie tego modułu.

Można śmiało powiedzieć, że można po prostu zignorować wycofanie. Ma na celu powiadomienie o nieużywanych metodach i modułach. Jak tylko faktycznie potrzebujesz / użyjesz Applicationgdzieś w swoim podgrafie, moduł będzie potrzebny, a ostrzeżenie o zaniechaniu zniknie.

David Medenjak
źródło
75
Skanuj odpowiedź, naciśnij polecenie + Q, Android Studio wyłącza się. Włącz mózg, wróć, przeczytaj odpowiedź ponownie.
Bri6ko
4
Nawiasem mówiąc, Ctrl + J. Ctrl + Q to próba trollowania.
StarWind0
4
@StarWind Trolling nie jest zamierzony, to jest skrót Windows;)
David Medenjak
2
Naprawdę nie rozumiem, dlaczego ta odpowiedź jest najlepsza?
Sever
2
@Sever Dokładnie, javadoc mówi wszystko. To tylko informacje o zbędnych częściach i, jak stwierdzono na końcu, można je po prostu zignorować. Zniknie po dodaniu kodu korzystającego z modułu.
David Medenjak
49

Jest wyświetlany jako przestarzały, ponieważ nie używasz komponentu i modułu w aplikacji przez

@Inject
SomeObjectFromModule mSomeObject

jeśli nie wstrzykujesz zależności w swoje aplikacje, nie ma sensu inicjować komponentu, więc sztylet poszukaj co najmniej jednego użycia

po dodaniu tych wierszy w dowolnych klasach, które chcesz wstrzyknąć widoki, a następnie wyczyść kompilację i odbuduj projekt, a Twoja przestarzałość zostanie rozwiązana

saksham
źródło
5
Powinna to być akceptowana odpowiedź. Ponadto nie zapomnij o „odbudowie projektu” po wstrzyknięciu.
sokarcreative
5

Pokazuje błąd, gdy moja metoda Modulenie ma @Providesmetody lub obiekt dostarczany przez Daggernie jest używany w aplikacji.
Przykład usunięcia przestarzałego modułu

Moduł

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

Czynność

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

LUB w komponencie

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

    void inject(SecondActivity activity);

    Book getBookTest();
}
Phan Van Linh
źródło
3

Mam ten sam problem z hostem i chcę tylko, aby każdy przestarzały problem z klasą Generated component Builder powinien sprawdzić dwie rzeczy, aby zaoszczędzić czas:

1 / Popraw składnię sztyletu dla modułu, komponent również dokładnie sprawdź, gdzie wstrzykujesz.

2 / Musi mieć obiekt iniekcji (wstrzyknąć adnotację i jej obiekt) w miejscu, które chcesz wstrzyknąć, w przeciwnym razie kompilator sztyletu nie może zobaczyć, gdzie użyć twojego modułu, więc jakaś metoda będzie przestarzała. Po prostu wstrzyknij co najmniej jeden moduł do miejsca wstrzyknięcia i skompiluj ponownie kod, nie będziesz już mieć tego problemu :)

danhnn.uit
źródło
1

otrzymasz przestarzałą metodę modułu, jeśli zadeklarujesz ją void inject(AppCompactActivity activity);w klasie komponentu. zamiast używać ścisłego sprzężenia, takiego jak śledzenie void inject(MainActivity activity);i przebudowywanie projektu, zobaczysz, że w klasie modułu nie ma metody przestarzałej

Mohd Qasim
źródło