2015-11-10 24 views
5

Daha önce sadece bir AppComponent dört modül (AppModule, NetworkModule, StorageModule,PresentersModule) ve enjekte edilen singletons her yerde vardı. Son zamanlarda, uygulamamda küçük bir refactoring yapmaya ve bunu kapsamlara ayırmaya karar verdim. Sunucular sadece aktiviteler içinde yaşayabileceğini düşünüyorum, bu yüzden @ActivityScope ve ActivityModule'u yarattım, ancak bu kapsamları nasıl karıştıracağımın yanlış anlaşılmasından dolayı proje derlenemiyor. Stackoverflow'ta birçok makale ve soru okuyorum, ancak her yerde modüllerin bağımsız olduğu basit örnekler var. Benim durumumda,Hançer 2 karma kapsamları

çalışmıyor.

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) 

Yani, soru benim ActivityComponent örneğini nasıl alabilirim: Ben bu hatayı alabilirsiniz?

Aşağıdaki modüller arasında bağımlılıkları görebilirsiniz

:

Uygulama modülü:

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

    public AppModule(MyApplication application) { ... } 

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

Ağ modülü:

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

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

Depolama modülü:

@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) { ... } 
} 

Sunum modülü:

@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) { ... } 
} 

Uygulama bileşeni:

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

Etkinlik bileşeni:

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

    void inject(SlidingTabsView view); 
} 

cevap

6

sorun benim PresentersModule oldu. Alt Bileşenler alt başlıklarındaki tüm nesne grafiğine erişebildiklerinden, bu bağımlılıkları alt modülüme eklemem gerekmemektedir. Bununla

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

: Yani, bu kodu değişti

@Module 
public final class PresentersModule { ... } 

ve sorunumu çözdü.

+1

Enjeksiyon yapmak için bu alt bileşeni nasıl oluşturabilirsiniz? – sector11