使用Fragment Factory时如何对带匕首的依赖项进行范围划分?

问题描述 投票:0回答:1

[不使用FragmentFactory,对Fragment内的作用域进行范围限定是向前的。只需为片段创建一个Subcomponent,然后在Fragment中创建onAttach()的子组件。

但是当使用FragmentFactory时,您不再通过子组件注入依赖项,而是在Fragment的构造函数中进行传递。

我想知道是否仍然可以使用Dagger声明仅在片段的生命周期内持续存在的依赖项。我目前无法想到实现此目标的方法。

因此,我没有将我的依赖项绑定到某个范围,而是只声明了任何范围的依赖项,或者仅在它们上使用@Reusable

此外,由于片段是通过FragmentFactory创建的,因此在DI图中不存在创建的Fragments

如何使用FragmentFactory如何适当地限制对片段的依赖关系,并能够在DI图中添加片段?

android android-fragments dagger-2
1个回答
1
投票

您可以通过使Subcomponent负责创建Fragment来完成此操作。 Fragment的作用域应与此Subcomponent相同。

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

    fun fooFragment(): FooFragment

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

在解决了所有循环依赖问题之后,此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)是循环依赖项的定义。您需要在此循环中的某个时间点插入LazyProvider,否则Dagger将在编译时抛出错误。

  2. 如果将其分为两个步骤,首先提供FooFragment,然后将其绑定到地图中,则子组件将从其父组件中看到@Provides方法。如果您不小心,可能会导致StackOverflowError

© www.soinside.com 2019 - 2024. All rights reserved.