Кинжал 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?

457   4  

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

    Ничего не найдено.