【问题标题】:How to scope dagger dependencies with fragments when using Fragment Factory?使用 Fragment Factory 时如何使用 Fragment 确定 Dagger 依赖关系?
【发布时间】:2020-04-14 16:58:32
【问题描述】:

如果不使用FragmentFactory,Fragment 中的范围依赖关系是直截了当的。只需为您的片段创建一个Subcomponent,然后在onAttach() 中创建Fragment 的子组件。

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

我想知道我是否仍然可以使用Dagger 声明一个只能在片段生命周期内持续存在的依赖项。我目前想不出一种方法来实现这一点。

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

另外,由于片段是通过FragmentFactory创建的,所以创建的Fragments在DI图中不存在。

当使用FragmentFactory 时,我们如何才能正确地将依赖范围限定为片段,并且还能够在 DI 图中添加片段?

【问题讨论】:

    标签: android android-fragments dagger-2


    【解决方案1】:

    您可以通过让Subcomponent 负责创建您的Fragment 来完成此操作。 Fragment 应该与 Subcomponent 具有相同的范围。

    @Subcomponent(modules = [/* ... */])
    @FragmentScope
    interface FooSubcomponent {
    
        fun fooFragment(): FooFragment
    
        @Subcomponent.Factory
        interface Factory {
            fun create(): FooSubcomponent
        }
    }
    

    在处理完所有循环依赖问题后,这个Subcomponent 的行为与您在onAttach() 中使用@BindsInstance 显式创建子组件相同,只是您现在可以(并且必须)在@ 上使用构造函数注入987654329@.

    为了在您的主组件(或父子组件)中提供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. 1234563如果您不小心,这可能会导致StackOverflowError

    【讨论】:

    • 我明白了,非常感谢。这是非常有用的。
    • 嗨@Nitrodon,我只是想知道您在为子片段执行此操作时是否有任何提示?
    • 听起来不错)@ContributesAndroidInjector 呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2019-02-27
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多