Как использовать кинжальные зависимости с фрагментами при использовании Fragment Factory? - PullRequest
0 голосов
/ 14 апреля 2020

Без использования FragmentFactory область видимости в пределах фрагмента является прямой. Просто создайте Subcomponent для своего фрагмента и просто создайте субкомпонент Fragment в onAttach().

Но при использовании FragmentFactory вы больше не вводите зависимости через субкомпонент, а вместо этого передаете затем в * Конструктор 1008 *.

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

Поэтому вместо привязки моих зависимостей к определенной области я просто объявляю зависимость с любой областью или просто использую @Reusable для них.

Кроме того, поскольку фрагменты создаются с помощью FragmentFactory, созданный Fragments не существует на графике DI.

Как мы можем правильно распределить зависимости между фрагментами, а также иметь возможность добавлять фрагмент в график DI при использовании FragmentFactory?

1 Ответ

1 голос
/ 14 апреля 2020

Вы можете выполнить sh, сделав Subcomponent ответственным за создание Fragment. Fragment должен иметь ту же область видимости, что и этот Subcomponent.

@Subcomponent(modules = [/* ... */])
@FragmentScope
interface FooSubcomponent {

    fun fooFragment(): FooFragment

    @Subcomponent.Factory
    interface Factory {
        fun create(): FooSubcomponent
    }
}

. После устранения любых проблем с зависимостями cycli c этот Subcomponent действует так же, как если бы вы явно создали субкомпонент в onAttach() с использованием @BindsInstance, за исключением того, что теперь вы можете (и должны) использовать инжекцию конструктора в FooFragment.

, чтобы обеспечить FooFragment в вашем основном компоненте (или родительском подкомпоненте), вам нужно установить этот Subcomponent в модуль.

@Module(subcomponents = [FooSubcomponent::class])
object MyModule {
    @Provides
    @IntoMap
    @FragmentKey(FooFragment::class)
    fun provideFooFragment(factory: FooSubcomponent.Factory): Fragment {
        return factory.create().fooFragment()
    }
}

Некоторые предостережения:

  1. Сценарий, который вы описываете (FooFragment зависит от некоторого класса, который зависит от FooFragment) - это определение циклической c зависимости. Вам нужно будет ввести Lazy или Provider в какой-то момент в этом цикле, иначе Dagger выдаст ошибку во время компиляции.

  2. Если вы разделите это на два этапа сначала предоставив FooFragment, а затем привязав его к вашей карте, подкомпонент увидит метод @Provides из своего родительского компонента. Это может вызвать StackOverflowError, если вы не будете осторожны.

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