2016-04-05 142 views
3

我在使用匕首2時遇到了問題。我非常喜歡Dagger 1和Dagger 2之間所做的更改,但今天我撞上了牆壁。匕首2 - 在兩個活動之間共享實例

問題在於範圍。

我正在關注MVP架構。我有兩個活動(一個列表和詳細信息),我希望他們兩個分享一個主持人。其原因是,演示者處理分頁,細節視圖有一個視圖分頁器,我希望在刷過分頁器時能夠在細節視圖中保持分頁。

目前我有兩個組成部分:ItemComponentAppComponent

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

的ItemComponent具有一個模塊:ItemModule 的ItemModule提供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); 
} 
} 

所有這些都有應付ItemScope

但在這兩個活動中,我需要初始化組件和模塊,因此提供了演示者的新實例。我在StackOverflow上已經閱讀了多個答案,我發現應該使用Component依賴和/或SubComponent來解決這個問題,但是我一直無法使它工作。

在此先感謝!

+0

既然(極大地簡化了)同時不能有2個有效的Activity派生類的聲明,這是什麼意思? – Selvin

+0

這不是我的目標。我的目標是讓ListPresenter的一個實例可以從ListActivity以及DetailsActivity訪問。 – palmithor

回答

0

您是否使用具有依賴關係或子組件的組件完全取決於您—主要區別在於關於哪些對象獲取提供給依賴關係/子組件。

您在這裏混合2個作用域:Item和Activity作用域。您還將包括另一個範圍其間類似如下:

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

如果你確實有一個範圍是「上面」的依賴於它的活動,你可以分享它提供的對象。

創建ItemComponent並保存在例如您的Application待分享。然後,在注入活動時,除了AppComponent之外,還需要包含ItemComponent —,從而共享列表和詳細活動之間的相關性。

然後,您的ItemsModule將僅提供Presenter或您的實際提供商可用於處理分頁/滾動的其他一些依賴項。

+1

好的,謝謝,這與我已經完成的工作有點類似。但是,如果我這樣做,那是通過應用程序共享ItemComponent,Item範圍是不是真的就像App Scope?也就是說,整個應用程序只有一個實例,而不僅僅是在列表活動的生命週期中? – palmithor

+0

@palmithor我有同樣的問題。你找到答案了嗎?我懷疑關鍵是範圍。我想,雖然共享相同的組件,但提供方法會根據範圍工作。讓我知道。 – rpattabi

+1

@rpattabi不幸的是我不記得我是如何解決這個問題的。如果我沒有記錯的話,我沒有按照上面描述的方式成功地做到這一點。 – palmithor