多次注入作用域对象的同一个实例

Inject the same instance of a scoped object multiple times

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

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

有什么不明白的吗?有没有一种方法可以在 类 中注入适配器,而无需在演示者或 Activity 中使用 setAdapter 方法手动设置?或者有没有办法限制 Adapter 创建的实例数?

编辑:依赖注入文件:

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

}

ChildFragmentChildPresenterMyAdapter类用@ActivityScope注释。

这是我让它工作的唯一方法,但对我来说似乎是错误的,因为 ChildPresenter 和 MyAdapter 仅在片段中使用。但是,用 @FragmentScope 注释它们会引发错误:"may not reference bindings with different scopes"。此外,片段 "provider" 和片段本身用两个不同的范围进行注释?

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

在您的情况下,您写道您的 presenter 拥有一个 adapter 并在其上调用 notifyItemChanged 方法。这是一个 Android 特定项目,不应该那样工作。 view 负责保存 adapter 以及从 presenter适配器应该通过视图发生。

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

  • view 创建并保存一个 adapter
  • 视图界面提供(并且activity实现)调用notifyAdapterItemChanged
  • presenter 需要告诉 adapter 数据已更新时,它会调用 view notifyAdapterItemChanged(并且 view 依次调用 adapter

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

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