我已经开始设置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采用不同的子组件以相同的方式实现?我能看到的只有一个区别是范围。我很感激有关这个问题的任何意见。
提前致谢!
答案 0 :(得分:3)
在TrackingComponent中,为什么要注入IntentService。也许更改为TrackingService会有所帮助
void inject(TrackingService context);