Я начал настраивать Dagger 2 и столкнулся со странной проблемой, которая мне кажется ошибкой.
У меня есть 1 основной компонент и 2 подкомпонента, которые я плюсую в родительском компоненте. Я использую разные scopes
для каждого подкомпонента. Проблема в том, что я могу легко ввести поля для первого подкомпонента, но не могу сделать то же самое для второго. Введенные поля остаются null
s.
Главный компонент:
@Singleton
@Component(modules = { WalletSaverAppModule.class })
public interface MyAppComponent {
TrackingComponent plus(TrackingModule module);
DashboardComponent plus(DashboardModule module);
}
1-й подкомпонент (работает хорошо):
@PerActivity @Subcomponent(modules = { DashboardModule.class })
public interface DashboardComponent {
void inject(MainActivity activity);
}
2-й подкомпонент (инъекция полей -> ноль):
@PerService @Subcomponent(modules = { TrackingModule.class })
public interface TrackingComponent {
void inject(IntentService context);
}
Как я делаю инъекции полей для 2-го подкомпонента:
public class TrackingService extends IntentService {
@Inject CallCase mCallCase;
@Inject CallModelMapper mCallModelMapper;
...
@Override protected void onHandleIntent(Intent intent) {
((MyApp) getApplication()).getAppComponent().plus(new TrackingModule(this)).inject(this);
// ---> here the both fields are null
...
Объекты, которые я ввожу:
@Singleton public class CallCase {
private CallRepository mCallRepository;
@Inject public CallCase(final CallRepository userRepository) {
mCallRepository = userRepository;
}
public Observable<Call> execute() {
...
}
}
@Singleton public class CallModelMapper {
@Inject CallModelMapper() {
}
public CallModel transform(@NonNull final Call callEntity) {
...
}
}
Оба объекта имеют область видимости @Singleton
(как их поля конструктора). Может быть, это конфликт масштабов?
--- ОБНОВЛЕНИЕ ---
Я проверил класс, сгенерированный Dagger2 (DaggerMyAppComponent
), который я использую в MyApp
для создания компонента приложения. Я нашел разницу между реализациями 1-го и 2-го компонентов.
1st:
private final class DashboardComponentImpl implements DashboardComponent {
private final DashboardModule dashboardModule;
private Provider<DashboardMvp.Presenter> providesPresenterProvider;
private MembersInjector<MainActivity> mainActivityMembersInjector;
private DashboardComponentImpl(DashboardModule dashboardModule) {
this.dashboardModule = Preconditions.checkNotNull(dashboardModule);
initialize();
}
private void initialize() {...}
@Override
public void inject(MainActivity activity) {...}
}
2nd:
private final class TrackingComponentImpl implements TrackingComponent {
private final TrackingModule trackingModule;
private TrackingComponentImpl(TrackingModule trackingModule) {
this.trackingModule = Preconditions.checkNotNull(trackingModule);
// ---> look, missing call initialize() <---
}
@Override
public void inject(IntentService context) {...}
}
Почему Dagger 2 использует разные подкомпоненты, которые реализованы одинаково? Единственное отличие, которое я вижу, это масштаб. Я был бы признателен за любые материалы по этой проблеме.
Заранее спасибо!