Метод модуля конструктора компонентів Dagger 2.2 застарілий


81

Я почав використовувати кинджал 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?

Відповіді:


181

Ви повинні прочитати опис, чому він не підтримується. Якщо ви використовуєте IDE, наприклад IntelliJ або Android Studio, ви можете просто вибрати метод і натиснути Control+Q на Windows, щоб прочитати Javadoc, включаючи повідомлення про припинення роботи.

У Javadoc написано:

@deprecated Цей модуль оголошено, але екземпляр не використовується в компоненті. Цей метод не застосовується. Для отримання додаткової інформації див. Https://google.github.io/dagger/unused-modules .

І за цим посиланням ви можете побачити:

Коли процесор Dagger генерує компоненти, йому потрібні лише екземпляри модулів та залежностей компонентів, які явно необхідні для подання запитів на прив'язку.

  • Якщо всі методи модуля, які використовуються в компоненті, є статичними, Dagger взагалі не потребує екземпляра цього модуля. Dagger може викликати статичні методи безпосередньо без модуля.
  • Якщо модуль не забезпечує прив'язок для Компонента, для побудови графіка не потрібен екземпляр цього модуля.

Можна з упевненістю сказати, що ви можете просто ігнорувати знецінення. Він призначений повідомити вас про невикористані методи та модулі. Як тільки ви дійсно вимагаєте / використовуєте Applicationдесь у вашому підграфі, модуль буде потрібен, і попередження про припинення дії зникне.


75
Сканувати відповідь, натиснути команду + Q, Android Studio вимикається. Увімкніть мозок, поверніться, прочитайте відповідь ще раз.
Bri6ko

4
Ctrl + J до речі. Ctrl + Q - спроба тролінгу.
StarWind0

4
@StarWind Немає тролінг призначений, це є ярлик для Windows;)
Девід Medenjak

2
Дійсно, не розумію, чому ця відповідь найкраща?
Север

2
@Sever Точно, javadoc все це говорить. Це лише деяка інформація про зайві деталі, і, як зазначено в кінці, ви можете просто ігнорувати її. Він зникне, коли ви додасте код, який використовує модуль.
Девід Меденяк,

49

Він відображається застарілим, оскільки ви не використовуєте компонент і модуль у своїй програмі до

@Inject
SomeObjectFromModule mSomeObject

якщо ви не вводите залежності у свої програми, не потрібно ініціалізувати ваш компонент, тому кинджал шукає принаймні одне використання

як тільки ви додасте ці рядки в будь-які класи, для яких ви хочете вводити подання, а потім очищайте збірку та перебудову проекту, і ваша застарілість буде вирішена


5
Це повинна бути прийнята відповідь. Крім того, не забувайте "Відновлювати свій проект" після ін'єкції.
sokarcreative

5

Це відображає помилку, коли у мене 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();
}

3

У мене така сама проблема з хостом, і я просто хочу, щоб усі застаріли проблеми у класі згенерованого конструктора компонентів повинні перевірити дві речі, щоб заощадити час:

1 / Виправте синтаксис кинджала для модуля, компонент також уважно перевірте, куди вводите.

2 / Потрібно мати об’єкт ін’єкції (анотація ін’єкції та її об’єкт) на місці, яке ви хочете зробити ін’єкцією, інакше компілятор кинджала не бачить, де використовувати ваш модуль, тому деякий метод буде застарілим. перекомпілюйте код, у вас більше не буде цієї проблеми :)


1

ви отримаєте метод модуля застарілим, якщо заявите void inject(AppCompactActivity activity);в класі компонентів. замість того, щоб вам довелося використовувати тісне зчеплення, як показано нижче, void inject(MainActivity activity);і перебудувати свій проект ви побачите, у класі модуля немає методу знежирення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.