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?
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
źródło
Pokazuje błąd, gdy moja metoda
Module
nie ma@Provides
metody lub obiekt dostarczany przezDagger
nie 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(); }
źródło
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 :)
źródło
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 śledzenievoid inject(MainActivity activity);
i przebudowywanie projektu, zobaczysz, że w klasie modułu nie ma metody przestarzałejźródło