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

3

我在使用Dagger 2时遇到了问题。我非常喜欢Dagger 1和Dagger 2之间的改变,但今天我碰到了一个难题。

这个问题涉及到作用域。

我正在遵循MVP架构。我有两个活动(列表和详细信息),我希望它们共享一个Presenter。原因是Presenter处理分页,详细视图具有ViewPager,我希望能够在滑动Pager时继续分页。

目前我有两个组件: 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 上的多个答案,并且我已经发现应该使用组件依赖项和/或子组件来解决这个问题,但我尚未能够使其正常工作。

提前致谢!


由于(大大简化后),不能同时存在两个有效的派生自Activity类的实例,那么这有什么意义呢? - Selvin
这不是我想要的。我的目标是让ListPresenter的一个实例可以从ListActivity和DetailsActivity中访问。 - palmithor
1个回答

0

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

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

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

如果您实际上拥有一个范围,在它所依赖的活动之上,您可以分享它提供的对象。

创建一个 ItemComponent 并将其保存在您的 Application 中以进行共享。然后,在注入您的活动时,除了 AppComponent 外,您还应该包括 ItemComponent - 从而在列表和详细信息活动之间共享依赖关系。

您的 ItemsModule 将仅提供 Presenter 或其他依赖项,通过它,您的实际提供程序可以处理分页/滚动。


1
好的,谢谢。这与我已经完成的工作有些相似。但是如果我通过应用程序共享ItemComponent,那么Item范围是否真的只像App范围一样?也就是说,在整个应用程序中只有一个实例,而不仅仅在List Activity的生命周期内? - palmithor
@palmithor 我有同样的问题。你找到答案了吗?我怀疑关键是范围。我猜,虽然相同的组件被共享,但提供的方法根据范围工作。告诉我吧。 - rpattabi
1
@rpattabi 很抱歉我不记得我是怎么解决的了。如果我没记错的话,我没有成功地按照我在上面描述的方法做。 - palmithor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接