2015-11-10 11 views
5

Vorher hatte ich nur eine AppComponent mit vier Modulen (AppModule, Network, StorageModule, PresentersModule) und injiziert überall Singletons. Vor kurzem habe ich beschlossen, kleines Refactoring in meiner app und teilen sie in Bereiche zu machen. Ich denke, Moderatoren können nur innerhalb von Aktivitäten leben, also habe ich @ActivityScope und ActivityModule erstellt, aber das Projekt kann nicht kompiliert werden, weil mein Missverständnis, wie diese Bereiche zu mischen. Ich habe eine Menge von Artikeln und Fragen zu Stackoverflow lesen, aber überall gibt es einfache Beispiele, bei denen Module unabhängig sind. In meinem Fall so etwas wieDagger 2 gemischte Bereiche

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

funktioniert nicht. Ich bekomme diese Fehlermeldung:

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) 

Also, die Frage ist, wie ich die Instanz von meinem ActivityComponent bekommen kann?

Sie können unter Abhängigkeiten zwischen den Modulen finden Sie unter:

Applikationsmodul:

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

    public AppModule(MyApplication application) { ... } 

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

Netzwerk-Modul:

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

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

-Speichermodul:

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

Presenters Modul:

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

Anwendungskomponente:

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

Aktivität Komponente:

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

    void inject(SlidingTabsView view); 
} 

Antwort

6

Das Problem war in meinem PresentersModule.

Da Subcomponents Zugriff auf ganze Objekte Graphen haben von ihren Eltern, ich brauche, um diese Abhängigkeiten in meinem Untermodul nicht enthalten. Also änderte ich diesen Code:

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

mit diesem:

@Module 
public final class PresentersModule { ... } 

und es ist mein Problem gelöst.

+1

Wie u diese Subkomponente bauen Einspritzung durchzuführen? – sector11

Verwandte Themen