使用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来解决这个问题,但我还没有能够让它运行起来。
提前致谢!
答案 0 :(得分:0)
您使用具有依赖关系或子组件的组件完全取决于您 - 主要区别在于将哪些对象提供给依赖项/子组件。
您在这里混合了2个范围:项目和活动范围。您可以在中间包含另一个范围,如下所示:
App Scope -> Item Scope -> (List) Activity Scope
\-> (Detail) Activity Scope
如果您确实有一个范围超过'根据它的活动,你可以分享它提供的对象。
创建ItemComponent
并将其保存在例如您要分享的Application
。然后,在注入您的活动时,除AppComponent
之外,您还要包含ItemComponent
- 从而共享列表和详细活动之间的依赖关系。
您的ItemsModule
将只提供Presenter
或其他依赖关系,您的实际提供商可以使用该依赖关系来处理分页/滚动。