2015-11-10 19 views
5

इससे पहले मैं केवल एक AppComponent चार मॉड्यूल (AppModule, NetworkModule, StorageModule, PresentersModule) और इंजेक्शन एकमात्र के साथ हर जगह था। हाल ही में, मैंने अपने ऐप में छोटे रिफैक्टरिंग करने और इसे स्कॉप्स में विभाजित करने का फैसला किया। मुझे लगता है कि प्रस्तुतकर्ता केवल गतिविधियों के भीतर ही रह सकते हैं, इसलिए मैंने @ActivityScope और गतिविधि मॉड्यूल बनाया है, लेकिन इन स्कॉप्स को मिश्रित करने के बारे में मेरी गलतफहमी के कारण परियोजना को संकलित नहीं किया जा सकता है। मैंने स्टैक ओवरफ्लो पर बहुत से लेख और प्रश्न पढ़े हैं, लेकिन हर जगह सरल उदाहरण हैं जहां मॉड्यूल स्वतंत्र हैं। मेरे मामले मेंडैगर 2 मिश्रित स्कोप

@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); 
} 

उत्तर

6

समस्या मेरी PresentersModule में था।

चूंकि सबकंपोनेंट्स के पास अपने माता-पिता से संपूर्ण ऑब्जेक्ट ग्राफ़ तक पहुंच है, इसलिए मुझे इन उप-मॉड्यूल में इन निर्भरताओं को शामिल करने की आवश्यकता नहीं है।

@Module(includes = { AppModule.class, NetworkModule.class, StorageModule.class }) 
public final class PresentersModule { ... } 
इस के साथ

: तो, मैं इस कोड को बदल

@Module 
public final class PresentersModule { ... } 

और यह मेरी समस्या हल हो जाती।

+1

इंजेक्शन करने के लिए आप इस सबकंपोनेंट को कैसे बनाया जाए? – sector11

संबंधित मुद्दे