Dagger 2 не генерирует реализацию подкомпонента

Я начал настраивать Dagger 2 и столкнулся со странной проблемой, которая мне кажется ошибкой.

У меня есть 1 основной компонент и 2 подкомпонента, которые я плюсую в родительском компоненте. Я использую разные scopes для каждого подкомпонента. Проблема в том, что я могу легко ввести поля для первого подкомпонента, но не могу сделать то же самое для второго. Введенные поля остаются nulls.

Главный компонент:

@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 использует разные подкомпоненты, которые реализованы одинаково? Единственное отличие, которое я вижу, это масштаб. Я был бы признателен за любые материалы по этой проблеме.

Заранее спасибо!


person Val    schedule 28.02.2017    source источник
comment
Что произойдет, если вы измените область действия TrackingComponent на PerActivity?   -  person yshrsmz    schedule 28.02.2017


Ответы (1)