2016-04-05 11 views
3

Ich habe ein Problem bei der Verwendung von Dolch 2. Ich habe die Änderungen zwischen Dolch 1 und Dolch 2 sehr gemocht, aber heute treffe ich eine Wand.Dolch 2 - Teilen von Instanzen zwischen zwei Aktivitäten

Das Problem betrifft Bereiche.

Ich folge einer MVP-Architektur. Ich habe zwei Aktivitäten (eine Liste und Details) und möchte, dass beide einen Moderator teilen. Der Grund dafür ist, dass der Präsentator die Paginierung behandelt und die Detailansicht einen Pager hat, und ich möchte in der Detailansicht paginieren können, wenn ich den Pager wische.

Zur Zeit habe ich zwei Komponenten: ItemComponent und AppComponent

@ApplicationScope 
@Component(modules = {AppModule.class, UIModule.class, DataModule.class}) 
public interface AppComponent extends AppGraph { 
    //Application Scoped dependencies 
} 

@ItemScope 
@Component(
    dependencies = AppComponent.class, 
    modules = ItemModule.class) 
public interface ItemComponent { 

    void inject(final ItemDetailsActivity itemDetailsActivity); 

    void inject(final ItemDetailsFragment itemDetailsFragment); 

    void inject(final ItemListActivity itemListActivity); 
} 

Das ItemComponent hat ein Modul: ItemModule Die ItemModule bietet ItemPresenter

@Module 
public class ItemModule { 

private ItemDetailsActivity itemDetailsActivity; 
private ItemDetailsFragment itemDetailsFragment; 
private ItemListActivity itemListActivity; 

public ItemModule(final ItemDetailsActivity itemDetailsActivity) { 
    this.itemDetailsActivity = itemDetailsActivity; 
} 

public ItemModule(final ItemDetailsFragment itemDetailsFragment) { 
    this.itemDetailsFragment = itemDetailsFragment; 
} 

public ItemModule(final ItemListActivity itemListActivity) { 
    this.itemListActivity = itemListActivity; 
} 

// The presenter that handles the pagination 
@Provides 
@ItemScope 
public ItemListPresenter provideItemListPresenter(final ItemService itemService) { 
    return new ItemListPresenter(itemService); 
} 
} 

All das habe die s ItemScope

Aber in beiden Aktivitäten muss ich die Komponente und das Modul initialisieren, und daher wird eine neue Instanz des Presenters bereitgestellt. Ich habe mehrere Antworten hier auf StackOverflow gelesen und ich habe herausgefunden, dass dies mit Component Abhängigkeiten und/oder SubComponent gelöst werden sollte, aber ich konnte es nicht funktionieren.

Vielen Dank im Voraus!

+0

da (mit großer Vereinfachung) kann nicht gleichzeitig 2 gültigen Klassen von Aktivität abgeleitet werden, was ist der Sinn dieser? – Selvin

+0

Das ist nicht was ich anstrebe. Ich beabsichtige, eine Instanz des ListPresenters sowohl von der ListActivity als auch von der DetailsActivity aus zugänglich zu machen. – palmithor

Antwort

0

Ob Sie Komponenten mit Abhängigkeiten oder Unterkomponenten verwenden, liegt ganz bei Ihnen — Der Hauptunterschied besteht darin, welche Objekte für Abhängigkeiten/Unterkomponenten bereitgestellt werden.

Sie mischen hier zwei Bereiche: Objekt- und Aktivitätsbereich. Sie würden einen anderen Bereich umfassen dazwischen wie folgt aus:

App Scope -> Item Scope -> (List) Activity Scope 
        \-> (Detail) Activity Scope 

Wenn Sie tatsächlich einen Bereich haben, der ‚über‘ die Aktivitäten je nach ist, können Sie die Objekte teilen es bietet.

Erstellen Sie die ItemComponent und halten Sie sie z.B. Ihre Application geteilt werden. Wenn Sie dann Ihre Aktivitäten einspeisen, fügen Sie zusätzlich zur AppComponent die ItemComponent — hinzu und teilen somit Abhängigkeiten zwischen Listen- und Detailaktivitäten.

Ihre ItemsModule liefert dann nur die Presenter oder eine andere Abhängigkeit, mit der Ihr tatsächlicher Anbieter Paging/Scrolling umgehen kann.

+1

Okay danke, das ist irgendwie ähnlich zu dem, was ich schon gemacht habe. Aber wenn ich es so mache, dass die ItemComponent durch die Anwendung geteilt wird, wäre der Item-Bereich nicht wirklich wie der App Scope? Das heißt, nur eine Instanz in der App und nicht nur während der Lebensdauer der Listenaktivität? – palmithor

+0

@palmithor Ich habe die gleiche Frage.Hast du die Antwort gefunden? Ich vermute, der Schlüssel ist der Umfang. Ich denke, während die gleiche Komponente geteilt wird, funktionieren die Bereitstellungs-Methoden entsprechend dem Umfang. Gib mir Bescheid. – rpattabi

+1

@rpattabi Leider kann ich mich nicht erinnern, wie ich das gelöst habe. Wenn ich mich richtig erinnere, ist es mir nicht gelungen, es so zu machen, wie ich es oben beschrieben habe. – palmithor

Verwandte Themen