首页 > 解决方案 > 多次注入同一个作用域对象实例

问题描述

我有一个 Activity 和它的演示者,都被注入了一个适配器。Activity 需要在 RecyclerView 上设置适配器,并且 Presenter 需要它notifyItemChanged在数据更改时调用更新方法(例如:)。

问题是因为适配器被注入了两次,所以演示者和活动没有相同的实例。我需要 Dagger 来创建它的一个实例。但是,适配器需要 Activity 的上下文并且必须@ActivityScope防止内存泄漏,这意味着我也不能@Singleton在其上使用范围。

有什么我不明白的吗?有没有办法在两个类中注入适配器,而无需使用setAdapter演示者或活动中的方法手动设置它?或者有没有办法限制创建的适配器实例的数量?

编辑:依赖注入文件:

@Module
public interface MainModule {

    @ActivityContext @Binds
    Context context(MainActivity activity);

    @ActivityScope @Binds
    MainContract.Presenter presenter(MainPresenter presenter);

    // CHILD FRAGMENT
    @FragmentScope @ContributesAndroidInjector
    ChildFragment childFragment();

    @ActivityScope @Binds
    ChildContract.Presenter childPresenter(ChildPresenter presenter);

    @ActivityScope @Binds
    ChildContract.AdapterView adapterView(MyAdapter adapter);

}

ChildFragmentChildPresenter并且MyAdapter类用 注释@ActivityScope

这是我让它工作的唯一方法,对我来说似乎是错误的,因为 ChildPresenter 和 MyAdapter 仅在片段中使用。@FragmentScope但是,用抛出错误注释它们:“可能不引用具有不同范围的绑定”。此外,片段“提供者”和片段本身是否用两个不同的范围进行了注释?

标签: androidandroid-adapterdagger-2android-mvp

解决方案


MVP架构中,演示者应该只关心业务逻辑。这意味着演示者对 Android 的东西一无所知,并且不包含任何 Android 特定项目。

在您的情况下,您写道您的演示者持有一个适配器并在其上调用notifyItemChanged方法。这是一个特定于 Android 的项目,不应以这种方式工作。视图负责持有适配器,从演示者适配器的任何交互都应该通过视图发生。

这对您的示例意味着什么:

  • 视图创建并持有一个适配器
  • 视图接口提供(并且活动实现)一个调用notifyAdapterItemChanged
  • 演示者需要告诉适配器数据已更新时,它调用视图 notifyAdapterItemChanged视图依次调用适配器

旁注:如果您需要以相反的方式提供数据(从适配器到演示者),我建议向演示者添加一个特殊的适配器接口,您可以将其作为适配器中的弱引用保留。

希望对您有所帮助,如果您有任何其他问题,请告诉我...


推荐阅读