Как создать настраиваемую область видимости и совместно использовать одни и те же экземпляры с помощью Dagger Android - PullRequest
0 голосов
/ 26 апреля 2018

Итак, вот что я знаю из doc

  1. Dagger Android под капотом создает подкомпонент для каждого действия, помеченного ContributesAndroidInjector
  2. Вы можете применить настраиваемую область к методу, где ContributesAndroidInjector аннотируется как
  3. Если два дочерних подкомпонента имеют одинаковую область действия, они все равно будут иметь разные экземпляры области действия
  4. ЕслиДеятельность находится в подкомпоненте, она может иметь свой собственный подкомпонент, который может содержать фрагменты.Эти фрагменты будут иметь общие экземпляры областей действия, которые есть у действия.

Теперь мой вопрос: как сделать, чтобы одно действие было субкомпонентом другого действия с помощью Dagger Android?

Я хочу сделатьэто потому, что я хочу достичь таких вещей, как @ UserScope / @ SessionScope.

С это Я знаю, что могу сделать это только с помощью Dagger, а не Dagger Android.Но с Dagger Android у вас может быть только Приложение (которое является AndroidInjector), чтобы внедрить Activity.Вы не можете использовать действие в качестве держателя или хоста родительского подкомпонента для внедрения другого действия.

Правильно ли я понимаю?

05/14/2018 Обновление:

В итоге я избавился от Dagger Android.Так что не более ContributesAndroidInjector, просто чистый кинжал.И чтобы ввести Activity / Fragment, я использую способ, который рекомендуется здесь .Это будет что-то вроде этого:

class MyActivity : AppCompatActivity() {
    private val factory: ViewModelProvider.Factory = Injector.myCustomScope().factory()
}

И мы пытаемся сделать так, чтобы фабрика была единственной вещью, которая нужна Деятельности / Фрагменту.

Пока это было здорово.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы можете создать пользовательский Scope, например, @PerScreen, также у вас будет @PerActvity scope.Разница между этими областями заключается в том, что область действия @PerActivity будет поддерживать общие зависимости между всеми действиями, такими как Context, Inflater Layout и т. Д. И все зависимости, относящиеся к конкретным действиям, будут определены как @PerScreen.

@PerApplication -> @PerActivity -> @PerScreen
* 1008.* Это может быть структурировано так.Я объяснил рамки под капотом в моем блоге , вы можете обратиться к нему, чтобы лучше понять этот вопрос.
0 голосов
/ 26 апреля 2018

Как сделать одно действие субкомпонентом другого действия с помощью Dagger Android?

tl; др Вы не можете.Dagger Android следует строгой схеме AppComponent > ActivityComponent > FragmentComponent, и нет никакого способа добавить пользовательские области видимости между ними.


Я предлагаю вам взглянуть на исходный код Dagger для Android, это действительно не так уж много.По сути, это HashMap для каждого слоя, где вы ищите компоновщик компонентов и строите субкомпонент.Фрагмент просматривает родительскую активность, а активность - приложение.Нет функции, позволяющей добавлять пользовательские компоненты между слоями.

То, что вы можете сделать, - это создать свой собственный вариант "Dagger Android", где вы можете реализовать свои собственные интерфейсы и смешивать / сочетатькомпоненты, как вам нужно.Но это совсем немного дополнительной работы.Я создал @PerScreen область действия, которая переживает изменения конфигурации в качестве доказательства концепции, если вам интересно посмотреть, как вы могли бы сделать такую ​​вещь.

...