Dagger 2不生成子组件实现

时间:2017-02-28 10:44:15

标签: java android dependency-injection dagger-2

我已经开始设置Dagger 2并面临一个奇怪的问题,对我来说就像是一个错误。

我有1个主要组件和2个子组件,我加上'在父组件中。我为每个子组件使用不同的scopes。问题是我可以轻松地为第一个子组件进行场注入,但我不能为第二个子组件做同样的事情。注入的字段保持null s。

主要组成部分:

@Singleton
@Component(modules = { WalletSaverAppModule.class })
public interface MyAppComponent {
  TrackingComponent plus(TrackingModule module);

  DashboardComponent plus(DashboardModule module);
}

第一个子组件(效果很好):

@PerActivity @Subcomponent(modules = { DashboardModule.class })
public interface DashboardComponent {
  void inject(MainActivity activity);
}

第二个子组件(字段注入 - > null):

@PerService @Subcomponent(modules = { TrackingModule.class })
public interface TrackingComponent {
  void inject(IntentService context);
}

我如何为第二个子组件注入字段:

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范围(作为构造函数字段)。这可能是范围冲突吗?

---更新---

我已经检查了我在DaggerMyAppComponent中使用的Dagger2(MyApp)生成的类来构建应用程序组件。我发现了第一和第二组件的实现之间的区别。

第一

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) {...}
  }

第二

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采用不同的子组件以相同的方式实现?我能看到的只有一个区别是范围。我很感激有关这个问题的任何意见。

提前致谢!

1 个答案:

答案 0 :(得分:3)

在TrackingComponent中,为什么要注入IntentService。也许更改为TrackingService会有所帮助

void inject(TrackingService context);