Dagger 2 Singleton Component Depend On Singleton

2019-04-05 07:18发布

问题:

I've got a strange problem here, and I'm not quite sure why what I'm doing isn't allowed. I've got the following modules:

@Module
public final class AppModule {
  private Context mContext;

  @Provides
  @Singleton
  @AppContext
  public Context provideContext() { return mContext; }
}

@Module
public final class NetModule {
  @Provides
  @Singleton
  public OkHttpClient provideOkHttp() {
    return new OkHttpClient.Builder().build();
  }
}

For various reasons, I don't want to have these two modules in the same component (basically due to my project structure). So I tried to create the following components:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
  @AppContext Context appContext();
}

@Singleton
@Component(dependencies = AppComponent.class, modules = NetModule.class)
public interface NetComponent {
  Retrofit retrofit();
}

But when I try to compile this, I get the following error message:

Error:(12, 1) error: This @Singleton component cannot depend on scoped components: @Singleton com.myapp.service.dagger.AppComponent

I understand why depending on different scopes would be bad and disallowed. But why is Singleton depends-on Singleton not allowed? This feels like it should work, since all I'm doing is declaring sibling components. What am I missing?

回答1:

Because your NetComponent component depends on your AppComponent component, they cannot have the same scope. Scopes are used to annotate lifecycles, and because NetComponent depends on AppComponent, they don't have the same lifecycle. AppComponent could potentially live longer than NetComponent, because it's a part of the actual build process of NetComponent. NetComponent couldn't exist without AppComponent, but not the other way around.

You could add your own custom scope and apply that to your NetComponent and NetModule, that would fix it.