Кинжал 2.2 компонент builder модульный метод устарел
Я начал использовать dagger 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?
4 ответов:
вы должны прочитать описание почему он устарел.Если вы используете IDE, как IntelliJ или Android Studio вы можете просто выбрать метод и нажмите управления + Q в Windows для чтения Javadoc, включая уведомление об устаревании.
в документации написано:
@deprecated этот модуль объявлен, но экземпляр не используется в компоненте. Этот метод не является op. For Подробнее см. https://google.github.io/dagger/unused-modules.
и по этой ссылке, вы можете увидеть:
когда процессор Dagger генерирует компоненты, ему требуются только экземпляры модулей и зависимостей компонентов, которые явно необходимы для подачи запросов на привязку.
- если все методы модуля, которые используются в компоненте, являются статическими, Dagger не нуждается в экземпляре этого модуля на все. Кинжал может вызывать статические методы непосредственно без модуля.
- если модуль не предоставляет Привязок для компонента, то для построения графа не требуется экземпляр этого модуля.
можно с уверенностью сказать, что вы можете просто игнорировать осуждения. Он предназначен для уведомления вас о неиспользуемых методах и модулях. Как только вы на самом деле требуется / использовать
Applicationгде-то в вашем подграфе модуль будет необходим, и предупреждение об устаревании исчезнет.
он показывает устаревший, потому что вы не используете компонент и модуль в своем приложении по
@Inject SomeObjectFromModule mSomeObjectЕсли вы не вводите зависимости в свои приложения, нет смысла инициализировать ваш компонент, поэтому dagger ищет хотя бы одно использование
Как только вы добавите эти строки в любые классы, которые вы хотите ввести представления, а затем очистить сборку и перестроить проект, и Ваше устаревание будет решено
У меня такая же проблема с хостом, и я просто хочу, чтобы у всех была устаревшая проблема с сгенерированным классом component builder, чтобы сэкономить время, нужно проверить две вещи:
1 / правильный синтаксис кинжала для модуля, компонент также тщательно проверьте, где вы вводите.
2 / должен иметь объект injection (inject annotation и его объект) на месте, которое вы хотите ввести, иначе компилятор dagger не сможет увидеть, где использовать ваш модуль, поэтому какой-то метод будет устаревшим.Просто вводить по крайней мере один модуль предоставляет вашему месту инъекции и повторно компилирует код, у вас больше не будет этой проблемы:)
он показывает ошибку, когда мой
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(); }
Comments