I'm using dagger:1.2.2
. There're two modules. BaseModule serves an EventBus for an Activity
and ActivityModule serves NavigationController for the same Activity
.
@Module(injects = { `does NOT have MainActivity.class registered`},
library = true
)
public class BaseModule {
@Provides @Singleton public EventBus provideEventBus() {
return DefaultEventBus.create();
}
@Provides @Singleton public Application provideApplication() {
return mApp;
}
@Provides @IsTablet public boolean isTablet(Application app) {
return app.getResources().getBoolean(R.bool.is_tablet);
}
}
@Module(
addsTo = BaseModule.class,
injects = MainActivity.class
)
public class ActivityModule {
@Provides
NavigationController provideNavigationController(Application app,@IsTablet boolean isTablet) {
return new NavigationController(app, isTablet);
}
}
Activity
's fields:
@Inject
EventBus mEventBus;
@Inject
NavigationController mNavigationController;
NavigationController's ugly ctor:
public NavigationController(Context context, FragmentManager fm, List<Behaviour> behaviourList, @Nullable Class lastRoot,
@IsTablet boolean isTablet, Application application) {
This code passes static validation and performs well with
protected void onCreate(Bundle savedInstanceState) {
ObjectGraph activityGraph = getBaseModuleGraph(this).plus(new ActivityModule(this));
activityGraph.inject(this);
}
It crushes as expected due to unsatisfied dependency provided by ActivityModule
if i just apply:
getBaseModuleGraph(this).inject(this);
The thing that bugs me is that BaseModule
's inject doesn't contain MainActivity
while it provides EventBus
dependency for it. If I add this inject it gonna complain about unresolved NavigationController that is provided by ActivityModule. Setting complete=false on the BaseModule
results in runtime exception
NavigationController has no injectable members. Do you want to add an injectable constructor? required by class MainActivity
I don't quite get it.
Ultimately I wanted BaseModule
's injects to be more explicit by including MainActivity
because it provides EventBus
as I mentioned.
Could you help me out understanding it?