[不使用FragmentFactory
,对Fragment内的作用域进行范围限定是向前的。只需为片段创建一个Subcomponent
,然后在Fragment
中创建onAttach()
的子组件。
但是当使用FragmentFactory
时,您不再通过子组件注入依赖项,而是在Fragment
的构造函数中进行传递。
我想知道是否仍然可以使用Dagger
声明仅在片段的生命周期内持续存在的依赖项。我目前无法想到实现此目标的方法。
因此,我没有将我的依赖项绑定到某个范围,而是只声明了任何范围的依赖项,或者仅在它们上使用@Reusable
。
此外,由于片段是通过FragmentFactory
创建的,因此在DI图中不存在创建的Fragments
。
如何使用FragmentFactory
如何适当地限制对片段的依赖关系,并能够在DI图中添加片段?
您可以通过使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()
}
}
一些警告:
您描述的场景(FooFragment
取决于某个类,该类取决于FooFragment
)是循环依赖项的定义。您需要在此循环中的某个时间点插入Lazy
或Provider
,否则Dagger将在编译时抛出错误。
如果将其分为两个步骤,首先提供FooFragment
,然后将其绑定到地图中,则子组件将从其父组件中看到@Provides
方法。如果您不小心,可能会导致StackOverflowError
。