Внедрить один и тот же экземпляр объекта с областью действия несколько раз - PullRequest
0 голосов
/ 29 мая 2018

У меня есть Activity и его ведущий, оба вводятся с адаптером.Для действия необходимо установить адаптер в RecyclerView, а докладчику - для вызова методов обновления (например, notifyItemChanged) при изменении данных.

Проблема заключается в том, что, поскольку адаптер вводится дважды, докладчики деятельность не имеет тот же экземпляр этого.Мне нужен Dagger, чтобы создать только один его экземпляр.Однако адаптеру нужен контекст действия и имеется @ActivityScope для предотвращения утечек памяти, что означает, что я также не могу использовать область действия @Singleton.

Что-то я не понимаю?Есть ли способ внедрить адаптер в оба класса, не устанавливая его вручную с помощью метода setAdapter в докладчике или в Activity?Или есть способ ограничить количество экземпляров созданного адаптера?

РЕДАКТИРОВАТЬ: Файлы внедрения зависимости:

@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, выдается ошибка: «не может ссылаться на привязки с разными областями действия».Также фрагмент «провайдер» и сам фрагмент помечены двумя разными областями действия?

1 Ответ

0 голосов
/ 29 мая 2018

В архитектуре MVP презентатор должен заботиться только о бизнес-логике.Это означает, что предъявитель ничего не знает о материалах Android и не содержит элементов, специфичных для Android.

В вашем случае вы писали, что в докладчике содержится адаптер и вызывает метод notifyItemChanged на нем.Это специфический для Android элемент, и он не должен работать таким образом. view отвечает за удержание адаптера , и любое взаимодействие от Presenter с адаптером должно происходить через view .

Что это означает для вашего примера:

  • view создает и содержит один адаптер
  • интерфейс представления обеспечивает (и действие реализует) вызов notifyAdapterItemChanged
  • , когда предъявитель должен сообщить *Адаптер 1044 , данные которого были обновлены, вызывает представление notifyAdapterItemChangedпредставление , в свою очередь, вызывает адаптер )

примечание: если вам нужно предоставить данные в обратном направлении (от адаптера до докладчика), я бы предложил добавить специальный интерфейс-интерфейс к докладчику, который вы можете сохранить в качестве слабой ссылки в адаптере.

Надеюсь, что это поможет, и дайте мне знать, если у вас есть дополнительные вопросы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...