首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匕首2混合镜

匕首2混合镜
EN

Stack Overflow用户
提问于 2015-11-10 00:31:36
回答 1查看 2.8K关注 0票数 7

以前,我只有一个AppComponent,它有四个模块(AppModule、NetworkModule、StorageModule、PresentersModule),而且到处都是单点注入。最近,我决定在我的应用程序中进行小规模重构,并将其划分为作用域。我认为,演示者只能生活在活动中,所以我创建了@ActivityScope和ActivityModule,但是由于我误解了如何混合这些作用域,所以无法编译该项目。我在堆栈溢出上读过很多文章和问题,但是在任何地方都有一些简单的例子,其中模块是独立的。在我的情况下,像

代码语言:javascript
复制
@Singleton
@Component(modules = { AppModule.class, StorageModule.class, NetworkModule.class })
public interface AppComponent {
  ActivityComponent plus(PresentersModule module); // <-- error
}

不起作用。我知道这个错误:

代码语言:javascript
复制
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)

因此,问题是如何获得我的的实例。

下面可以看到模块之间的依赖关系:

应用模块:

代码语言:javascript
复制
@Module
public final class AppModule {
  private final MyApplication mApplication;

  public AppModule(MyApplication application) { ... }

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

网络模块:

代码语言:javascript
复制
@Module(includes = { AppModule.class })
public final class NetworkModule {
  @Provides @Singleton FeedBurnerApi provideFeedBurnerApi(Application application) { ... }

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

存储模块:

代码语言:javascript
复制
@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) { ... }
}

主持人模块:

代码语言:javascript
复制
@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) { ... }
}

申请部分:

代码语言:javascript
复制
@Singleton
@Component(modules = { AppModule.class, StorageModule.class, NetworkModule.class })
public interface AppComponent {}

活动构成部分:

代码语言:javascript
复制
@Subcomponent(modules = PresentersModule.class)
@ActivityScope
public interface ActivityComponent {
  void inject(FeedPageView view);

  void inject(SlidingTabsView view);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-10 10:35:20

问题出在我的PresentersModule上。

因为子组件可以从它们的父组件访问整个对象图,所以我不需要在子模块中包含这些依赖项。所以,我修改了这个代码:

代码语言:javascript
复制
@Module(includes = { AppModule.class, NetworkModule.class, StorageModule.class })
public final class PresentersModule { ... }

在这方面:

代码语言:javascript
复制
@Module
public final class PresentersModule { ... }

它解决了我的问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33620909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档