Intereting Posts
Уменьшить размер отладки APK в IntelliJ Как выделить даты календаря, даты которых поступают из базы данных Приложение для Android не начинается с ярлыка Genymotion не загрузит виртуальное устройство Как получить имя пользователя Twitter с помощью Twitter 4j Android, этот API помечен как внутренний для библиотеки поддержки и не должен быть доступен из приложений. Android: Постоянный сеанс сервера с использованием cookie при выполнении HTTP-вызовов Значок навигации панели инструментов не установлен Как выйти из полноэкранного веб-приложения Android-соединение между хостом и последовательным интерфейсом USB? Панель инструментов: IllegalStateException – настройте свою сборку для VectorDrawableCompat Загрузка сглаживания изображений с использованием контекста приложения Мультиплексированная точка доступа в Android Получить текущие обои абсолютного пути? Рисовать растровые изображения из ресурсов над другим

Dagger 2 Custom Scope для каждого фрагмента (или Activity и т. Д.)

Я просмотрел несколько разных статей, которые, как представляется, предлагают два разных способа выполнения пользовательского охвата в кинжале 2:

  1. Презентаторы MVP, которые пересматривают конфигурацию изменений Часть 2 ( Github repo ):

    • Использует уникальные пользовательские области для каждого фрагмента, например @Hello1Scope и @Hello2Scope для Hello1Fragment и Hello2Fragment соответственно
  2. Дегустация кинжала 2 на Android :

    • Использует единую настраиваемую область для всех фрагментов, например @PerFragment .

Из того, что я понимаю, кажется, что, как и в методе 2, должно быть хорошо иметь одну определенную область, которая может использоваться для всех фрагментов (т. @PerFragment ). На самом деле (пожалуйста, поправьте меня, если я ошибаюсь), похоже, что имя настраиваемой области не имеет значения, и это важно только там, где создается подкомпонент (т. Е. В приложении, активности или фрагменте).

Есть ли какой-либо вариант использования для определения уникальной области для каждого фрагмента, например, в случае 1?

Solutions Collecting From Web of "Dagger 2 Custom Scope для каждого фрагмента (или Activity и т. Д.)"

После прочтения ответа от @vaughandroid, а что определяет жизненный цикл компонента (графа объектов) в кинжале 2? Я думаю, что я правильно понимаю пользовательские области, чтобы ответить на мой собственный вопрос.

Во-первых, вот пара правил при работе с компонентами, модулями и аннотациями в кинжале2.

  • Компонент должен иметь аннотацию (одного) @Singleton (например, @Singleton или @CustomScope ).
  • Модуль не имеет аннотации области.
  • Метод модуля может иметь (единую) область, которая соответствует его компоненту или без области, где:
    • Scoped : означает, что для каждого экземпляра компонента создается один экземпляр.
    • Unscoped : означает, что создается новый экземпляр с каждым вызовом inject () или провайдера
    • ПРИМЕЧАНИЕ. Dagger2 резервирует @Singleton для корневого компонента (и его модулей). Субкомпоненты должны использовать настраиваемую область, но функциональность этой области точно такая же, как @Singleton .

Теперь, чтобы ответить на вопрос: я бы сказал, создайте новую именованную область для каждой концептуально различной области. Например, создайте @PerActivity , @PerFragment или @PerView которая указывает, где должен быть создан экземпляр компонента, и таким образом указывая на его продолжительность жизни.

Примечание : это компромисс между двумя крайностями. Рассмотрим случай корневой компоненты и n подкомпонентов, которые вам понадобятся:

  • Как минимум 2 аннотации ( @Singleton и @SubSingleton ), и
  • Не более n + 1 аннотаций ( @Singleton , @SubSingleton1 , … @SubSingletonN ).

Пример:

Заявка:

 /** AppComponent.java **/ @Singleton @Component( modules = AppModule.class ) public interface AppComponent{ void inject(MainActivity mainActivity); } /** AppModule.java **/ @Module public class AppModule{ private App app; public AppModule(App app){ this.app = app; } // For singleton objects, annotate with same scope as component, ie @Singleton @Provides @Singleton public App provideApp() { return app; } @Provides @Singleton public EventBus provideBus() { return EventBus.getDefault(); } } 

Фрагмент:

 /** Fragment1Component.java **/ @PerFragment @Component( modules = {Fragment1Module.class}, dependencies = {AppComponent.class} ) public interface Fragment1Component { void inject(Fragment1 fragment1); } /** Fragment1Module.java **/ @Module public class Fragment1Module { // For singleton objects, annotate with same scope as component, ie @PerFragment @Provides @PerFragment public Fragment1Presenter providePresenter(){ return new Fragment1Presenter(); } } /** PerFragment.java **/ @Scope @Retention(RetentionPolicy.RUNTIME) public @interface PerFragment {} 

Ваше понимание верное. Названные области позволяют вам сообщать о намерениях, но все они работают одинаково.

  • Для методов поставщиков с ограниченным охватом каждый экземпляр компонента будет создавать 1 экземпляр предоставленного объекта.
  • Для методов провайдера без доступа каждый экземпляр компонента создает новый экземпляр предоставленного объекта, когда ему нужно его вводить.

Тем не менее важно время жизни экземпляра Component. 2 разных экземпляра одного и того же компонента будут предоставлять разные экземпляры объектов, даже ограниченные.

Имена @PerFragment должны указывать время жизни предоставленного объекта (что соответствует экземпляру Component), поэтому @PerFragment имеет для меня гораздо больше смысла.

Из краткого обзора учебника «MVP Presenters …» мне не совсем ясно, что намерение автора состоит в том, чтобы иметь отдельные области. Поскольку имена являются просто выброшенными, я не стал бы слишком много читать.