【问题标题】:Android Dagger - Dynamic feature module can't inject from AppComponentAndroid Dagger - 动态功能模块无法从 AppComponent 注入
【发布时间】:2021-05-31 09:58:54
【问题描述】:

在 :app 模块中

@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
    @Component.Factory
    interface Factory {
        fun create(@BindsInstance context: Context): AppComponent
    }
}    
@Module
class AppModule {
    @Singleton
    @Provides
    fun provideA() = A()
}

在动态功能模块中

@Component(
        dependencies = [AppComponent::class],
        modules = [FeatureModule::class]
)
interface FeatureComponent{
    @Component.Factory
    interface Factory {
        fun create(appComponent: AppComponent): FeatureComponent
    }

    fun inject(fragment: HomeFragment)

}
@Module
class FeatureModule {
}

在 HomeFragment 或 HomeViewModel 中,我无法注入对象 A(在 AppComponent 中的 AppModule 中提供)。 如何解决?

谢谢。

【问题讨论】:

    标签: android dagger-2


    【解决方案1】:

    当你使用 Dagger 的组件依赖时(就像你正在做的那样), 当FeatureComponent 依赖于AppComponent 时, 那么AppComponent 需要使用提供函数暴露依赖关系,以便FeatureComponent 可以注入它们。

    配置函数只是组件接口中的函数,例如:

    @Singleton
    @Component(modules = [AppModule::class])
    interface AppComponent {
    
        fun provideA(): A // <--- this is a provision function, you need to add this to expose "A" from AppComponent
    
        @Component.Factory
        interface Factory {
            fun create(@BindsInstance context: Context): AppComponent
        }
    }
    

    就像 Dagger Modules 中的其他函数一样,这些函数的名称并不重要。但是它们的返回类型和限定符(如果有的话)很重要。

    您还可以将这些提供功能提取到其他接口,并使您的AppComponent 扩展这些其他接口,以保持您的代码库井井有条,就像in this sample project 一样。

    来自docs

    当一个类型被用作组件依赖时,每个提供方法 依赖项被绑定为提供者。请注意,只有绑定 暴露为提供方法可通过组件获得 依赖关系。

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 1970-01-01
      • 2022-01-11
      • 2020-02-12
      • 1970-01-01
      • 2020-12-19
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多