注入带有活动参考的片段

Gab*_*tin 5 android dagger dagger-2

DashboardActivity在 viewpager 中有一个包含两个片段 A 和 B的类。每个 Fragment 分别有自己的ViewModelAViewModelBViewModel

现在我正在创建一个Subcomponentfor DashboardActivity,它绑定了两个视图模型实例并通过 将它们注入到片段中ContributesAndroidFragment

我如何为每个 Fragment 创建一个子组件,以便NavigationController仍然可以满足需要活动(在这种情况下)的依赖项?即如何通过提供片段所附加的活动来创建此子组件?

考虑到这些片段可以添加到应用程序的其他地方,因此附加活动在运行时可能会有所不同。

这是我如何做到的:

应用组件:

@Singleton
@Component(
        modules = [
            ApplicationModule::class,
            AndroidSupportInjectionModule::class,
            NetModule::class,
            ...
            ActivityBindings::class
        ]
)
interface ApplicationComponent : AndroidInjector<MyApp> {

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance application: Application): ApplicationComponent
    }
}
Run Code Online (Sandbox Code Playgroud)

活动绑定:

@Module
abstract class ActivityBindings {
    @ContributesAndroidInjector(modules = [DashboardModule::class])
    @PerActivity
    abstract fun dashboardModule(): DashboardActivity
    ...
}
Run Code Online (Sandbox Code Playgroud)

仪表板模块:

@Module(includes = [CommonActivityModule::class])
abstract class DashboardModule {

    @Binds
    abstract fun bindsActivity(activity: DashboardActivity): AppCompatActivity

    @ContributesAndroidInjector
    abstract fun contributeFragmentA(): FragmentA

    @ContributesAndroidInjector
    abstract fun contributesFragmentB(): FragmentB


    @Binds
    @IntoMap
    @ViewModelKey(BViewModel::class)
    @PerActivity
    internal abstract fun bViewModel(bViewModel: BViewModel): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(AViewModel::class)
    @PerActivity
    internal abstract fun aViewModel(aViewModel: AViewModel): ViewModel

}
Run Code Online (Sandbox Code Playgroud)

通用活动模块:

@Module(includes = [ViewContainerModule::class, ViewModelBuilder::class])
abstract class CommonActivityModule {

    @Binds
    @ForActivity
    abstract fun bindsContext(activity: AppCompatActivity): Context

    @Module
    companion object {

        @Provides
        @PerActivity
        @JvmStatic
        fun provideNavigationController(activity: AppCompatActivity) = NavigationController(activity)
    }
}
Run Code Online (Sandbox Code Playgroud)

附注。我需要能够从fragmentAand注入更多片段fragmentB,所以它们也应该充当 AndroidInjectors