Метод модуля компоновщика компонента Dagger 2.2 устарел
Я начал использовать кинжал 2.2, а методы модуля в компоновщике компонентов устарели.
Это мой компонент приложения:
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
void inject(Application application);
}
И модуль приложения:
@Module
public class ApplicationModule {
Application application;
public ApplicationModule(Application application) {
this.application = application;
}
@Provides
@Singleton
Application providesApplication() {
return application;
}
}
Вот сгенерированный класс:
@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;
}
}
}
Как инициализировать компонент, если не с помощью ComponentBuilder?
Ответы
Ответ 1
Вы должны прочитать описание того, почему оно устарело. Если вы используете IDE, например IntelliJ или Android Studio, вы можете просто выбрать метод и нажать Control + Q на Windows, чтобы прочитайте Javadoc, включая уведомление об отказе.
Javadoc читает:
@deprecated Этот модуль объявлен, но экземпляр не используется в компоненте. Этот метод не работает. Подробнее см. https://google.github.io/dagger/unused-modules.
И по этой ссылке вы можете увидеть:
Когда процессор Dagger генерирует компоненты, он требует только экземпляров модулей и зависимостей компонентов, которые явно необходимы для подачи запросов на привязку.
- Если все методы модулей, которые используются в компоненте, являются статическими, Dagger вообще не нуждается в экземпляре этого модуля. Кинжал может напрямую ссылаться на статические методы без модуля.
- Если модуль не создает привязки для Компонента, для построения графика не требуется экземпляр этого модуля.
Можно с уверенностью сказать, что вы можете просто игнорировать устаревание. Он предназначен для уведомления вас о неиспользуемых методах и модулях. Как только вы на самом деле потребуете/используете Application
где-то на вашем подграфе, модуль понадобится, и предупреждение об устаревании исчезнет.
Ответ 2
Это проявляется устаревшим, потому что вы не используете компонент и модуль в своем приложении
@Inject
SomeObjectFromModule mSomeObject
если вы не используете инъекции зависимостей в ваших приложениях, вам не нужно инициализировать ваш компонент, чтобы кинжал выглядел хотя бы для одного использования
после того, как вы добавите эти строки в любые классы, которые хотите вводить виды, а затем очистите сборку и перестройте проект, и ваша усталость будет решена.
Ответ 3
У меня такая же проблема с хостом, и я просто хочу, чтобы у всех была устаревшая проблема в классе Generated component builder, чтобы проверить две вещи, чтобы сэкономить время:
1/Правильный синтаксис кинжала для модуля, компонент также тщательно проверьте, куда вы вставляете.
2/Должен иметь объект инъекции (добавить аннотацию и его объект) на место, которое вы хотите ввести, иначе компилятор кинжалов не сможет увидеть, где использовать ваш модуль, поэтому какой-то метод будет устаревшим. Просто введите хотя бы один модуль для вашего место инъекции и перекомпилировать код, у вас больше не будет этой проблемы:)
Ответ 4
Он показывает ошибку, когда мой Module
не имеет метода @Provides
или объект, предоставляемый Dagger
, не используется в приложении.
Пример удаления устаревшего модуля
Модуль
@Module
public class SecondActivityModule {
@Provides
Book provideBookTest() {
return new Book();
}
}
Деятельность
public class SecondActivity extends AppCompatActivity {
@Inject
Book test;
...
}
ИЛИ в компоненте
@Component(modules = SecondModule.class)
public interface SecondComponent {
void inject(SecondActivity activity);
Book getBookTest();
}