【发布时间】:2018-05-28 21:30:53
【问题描述】:
我有一个 Activity 和它的 Presenter,它们都被注入了一个 Adapter。 Activity 需要在 RecyclerView 上设置适配器,并且 Presenter 需要它在数据发生变化时调用更新方法(例如:notifyItemChanged)。
问题是因为适配器被注入了两次,所以演示者和活动没有相同的实例。我需要 Dagger 来创建它的一个实例。但是,Adapter 需要 Activity 的上下文并且有 @ActivityScope 来防止内存泄漏,这意味着我不能同时在其上使用 @Singleton 范围。
有什么我不明白的吗?有没有办法在两个类中注入适配器,而无需在演示者或活动中使用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);
}
ChildFragment、ChildPresenter 和 MyAdapter 类使用 @ActivityScope 注释。
这是我让它工作的唯一方法,对我来说似乎是错误的,因为 ChildPresenter 和 MyAdapter 仅在片段中使用。但是,用@FragmentScope 注释它们会引发错误:“可能不引用具有不同范围的绑定”。另外,片段“提供者”和片段本身是用两个不同的范围注释的?
【问题讨论】:
-
使用
@ActivityScope有什么问题? -
没什么,但我不能拥有这个范围,而且
@Singleton也不能限制为一个实例。 -
为什么需要限制为一个实例? Presenter、Adapter 和 Activity 都应该在
@ActivityScope—问题已解决。如果你想保存一些状态,你可以创建一些@Singleton Repository或保存数据等的东西 -
他们都已经在
@ActivityScope。我的适配器没有状态,我的演示者有。因为presenter提供数据并更新adapter,所以更新和显示的必须是同一个实例,所以我只需要一个实例。 -
相信你对示波器有错误的印象。作用域对象在其作用域中存在一次。如果一切都是活动范围的,那么每个活动将只有一个。
标签: android android-adapter dagger-2 android-mvp