Подтвердить что ты не робот

Метод модуля компоновщика компонента 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?

4b9b3361

Ответ 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();
}