Создание элемента 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 при создании приложения.