Dagger 2 - 在两个活动之间共享实例

时间:2016-04-05 12:29:14

标签: android dagger-2

使用Dagger 2时遇到问题。我真的很喜欢Dagger 1和Dagger 2之间的变化,但今天我碰到了墙。

问题与范围有关。

我正在关注MVP架构。我有两个活动(列表和详细信息),我希望他们两个共享一个演示者。原因是演示者处理分页并且详细信息视图有一个视图寻呼机,我希望能够在滑动寻呼机时在细节视图内保持分页。

目前我有两个组件: ItemComponent 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);
}

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来解决这个问题,但我还没有能够让它运行起来。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您使用具有依赖关系或子组件的组件完全取决于您 - 主要区别在于将哪些对象提供给依赖项/子组件。

您在这里混合了2个范围:项目和活动范围。您可以在中间包含另一个范围,如下所示:

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

如果您确实有一个范围超过'根据它的活动,你可以分享它提供的对象。

创建ItemComponent并将其保存在例如您要分享的Application。然后,在注入您的活动时,除AppComponent之外,您还要包含ItemComponent - 从而共享列表和详细活动之间的依赖关系。

您的ItemsModule将只提供Presenter或其他依赖关系,您的实际提供商可以使用该依赖关系来处理分页/滚动。