I'm having a similar problem like the one in this question. While the accepted answer does help, but I'm missing final piece to solve the problem.
I have 2 android library modules: common
and exp
which depends on common
.
Everything under common
:
@Module
public class CommonModule {
@Singleton
@Provides
public Repository providesRepository() {
return new Repository();
}
}
@Singleton
@Component(modules={CommonModule.class})
public interface CommonComponent {
void inject(CommonClass commonClass);
/**
CommonClass needs instance of Repository
**/
}
public class CommonDIHolder {
public static CommonComponent sComponent;
public static void init() {
sComponent = DaggerCommonComponent.builder().build();
}
}
Everything under exp
:
@Module(includes={CommonModule.class})
public class ExpModule {
@Singleton
@Provides
public ExpResource provideExpResource() {
return new ExpResource();
}
}
@Singleton
@Component(modules={ExpModule.class}, dependencies={CommonComponent.class})
public interface ExpComponent {
void inject(ExpClass expClass);
/**
ExpClass needs instance of Repository and ExpResource
**/
}
public class ExpDIHolder {
public static ExpComponent sComponent;
public static void init() {
sComponent = DaggerExpComponent.builder()
.commonComponent(CommonDIHolder.sComponent)
.build();
}
}
I need both CommonClass
and ExpClass
receive the same instance of Repository
.
The problem with this approach is that @Singleton
can't depends on @Singleton
. So I have to change the scope of ExpComponent
into self-defined scope called @ExpScope
. Then I changed the provideExpResource
into @ExpScope
as well.
Then I encountered an error saying that ExpComponent
may not reference bindings with different scopes. It refers to the provideRepository
which has different scope (@Singleton
) on it. If I changed the scope into ExpScope
then the CommonComponent
will have different scope with provideRepository
.
If I changed all @Singleton
into @ExpScope
then I receive this error message: depends on scoped components in a non-hierarchical scope ordering
What should I do? Or I'm doing the wrong approach here?