Создание элемента MembersInjector для [Class]. Предпочитают вместо этого запускать процессор кинжала над этим классом

У меня есть эти предупреждения, и я не понимаю, что они означают. Может ли кто-нибудь мне что-то указать?

Для классов, которые вводят в (где есть инструкция component.inject(this))

Note: Generating a MembersInjector for [class] Prefer to run the dagger processor over that class instead.

Для объекта я впрыскиваю (constuctor, аннотированный с помощью @Inject)

Note: Generating a Provider for [class]. Prefer to run the dagger processor over that class instead.

Ответ 1

Когда процессор аннотаций Dagger запускается, он генерирует два типа классов:

  • Реализации интерфейсов @Component
  • Provider и MembersInjector для каждого типа @Inject 'd.

Пока он генерирует реализацию интерфейса @Component, он соединяет каждую из реализаций Provider и MembersInjector в соответствии с настройками ваших модулей. Если ваш компонент или любой из модулей в нем ссылаются на тип @Inject 'd, который был скомпилирован без процессора Dagger, он все равно будет генерировать Provider или MembersInjector, но один раз для каждого компонента, а не один раз для @Inject 'd.

Это не проблема (следовательно, это не предупреждение или ошибка), но это означает, что потенциально возможно, что процессор Dagger будет генерировать одни и те же классы много раз для одного приложения. Это может замедлить компиляцию, если и займет немного больше байт-кода, если он действительно выходит из-под контроля.

Простое исправление заключается в том, чтобы убедиться, что вы используете обработчик аннотаций Dagger при компиляции типов @Inject 'd, а также ваших компонентов.

Ответ 2

Я получал предупреждение "Generating a MembersInjector for..." Dagger 2, когда у меня был суперкласс и подкласс следующим образом:

public abstract class BaseActivity extends Actvity {

    @Inject
    DependencyA dependencyA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((MyApplication) getApplication()).getComponent().inject(this);
}

public class ConcreteActivity extends BaseActvity {

    @Inject
    DependencyB dependencyB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((MyApplication) getApplication()).getComponent().inject(this);
    }
}

... и мой интерфейс Component имел два метода впрыска следующим образом:

void inject(BaseActivity activity);
void inject(ConcreteActivity activity);

Я удалил метод inject(BaseActivity activity) из моего интерфейса Component, и я удалил вызов метода Component.inject(this) из класса BaseActivity. Инъекция в BaseActivity по-прежнему работает так, как ожидается, когда подкласс (ConcreteActivity) вызывает Component.inject(this), и я больше не вижу предупреждения "Generating a MembersInjector for..." Dagger 2 при создании приложения.