Кинжал 2 смешанные области

раньше у меня был только один AppComponent С четырьмя модулями (модуль, NetworkModule, StorageModule, PresentersModule) и вводят синглтоны повсюду. Недавно я решил сделать небольшой рефакторинг в своем приложении и разделить его на области. Я думаю, ведущие могут жить только в рамках деятельности, поэтому я создал @ActivityScope и ActivityModule, но проект не может быть скомпилированный из-за моего непонимания, как смешивать эти области. Я прочитал много статей и вопросов в stackoverflow, но везде есть простые примеры, когда модули независимы. В моем случае такая вещь, как

@Singleton
@Component(modules = { AppModule.class, StorageModule.class, NetworkModule.class })
public interface AppComponent {
  ActivityComponent plus(PresentersModule module); // <-- error
}

не работает. Я получаю эту ошибку:

Error:(19, 1) error: com.my.package.di.component.ActivityComponent scoped with @com.my.package.di.scope.ActivityScope may not reference bindings with different scopes:
@Provides @Singleton android.app.Application com.my.package.di.module.AppModule.provideApplication()
@Provides @Singleton com.my.package.network.FeedBurnerApi com.my.package.di.module.NetworkModule.provideFeedBurnerApi(android.app.Application)
@Provides @Singleton android.database.sqlite.SQLiteOpenHelper com.my.package.di.module.StorageModule.provideSQLiteOpenHelper(android.app.Application)
@Provides @Singleton com.my.package.storage.Repository com.my.package.di.module.StorageModule.provideRepository(android.database.sqlite.SQLiteOpenHelper)
@Provides @Singleton com.my.package.SharedPreferencesHelper com.my.package.di.module.StorageModule.provideSharedPreferencesHelper(android.app.Application)

Итак, вопрос в том, как я могу получить экземпляр моего ActivityComponent?

вы можете увидеть зависимости между модулями ниже:

приложения модуль:

@Module
public final class AppModule {
  private final MyApplication mApplication;

  public AppModule(MyApplication application) { ... }

  @Provides @Singleton Application provideApplication() { ... }
}

сетевой модуль:

@Module(includes = { AppModule.class })
public final class NetworkModule {
  @Provides @Singleton FeedBurnerApi provideFeedBurnerApi(Application application) { ... }

  @Provides @Singleton Retrofit provideRetrofit() { ... }
}

модуль памяти:

@Module(includes = { AppModule.class })
public final class StorageModule {
  @Provides @Singleton Repository provideRepository(SQLiteOpenHelper sqLiteOpenHelper) { ... }

  @Provides @Singleton SQLiteOpenHelper provideSQLiteOpenHelper(Application application) { ... }

  @Provides @Singleton SharedPreferencesHelper provideSharedPreferencesHelper(Application application) { ... }
}

модуль докладчики:

@Module(includes = { AppModule.class, NetworkModule.class, StorageModule.class })
public final class PresentersModule {
  @Provides FeedPageViewPresenter provideFeedPageViewPresenter(FeedBurnerApi api, Repository repository, SharedPreferencesHelper preferences) { ... }

  @Provides @ActivityScope SlidingTabsViewPresenter provideSlidingTabsViewPresenter(Repository repository) { ... }
}

приложения компонентов:

@Singleton
@Component(modules = { AppModule.class, StorageModule.class, NetworkModule.class })
public interface AppComponent {}

активность компонента:

@Subcomponent(modules = PresentersModule.class)
@ActivityScope
public interface ActivityComponent {
  void inject(FeedPageView view);

  void inject(SlidingTabsView view);
}

1 ответов


проблема была в моем PresentersModule.

поскольку Подкомпоненты имеют доступ ко всему графу объектов от своих родителей, мне не нужно включать эти зависимости в мой субмодуль. Итак, я изменил этот код:

@Module(includes = { AppModule.class, NetworkModule.class, StorageModule.class })
public final class PresentersModule { ... }

С этого:

@Module
public final class PresentersModule { ... }

и это решило мою проблему.