注入带有活动参考的片段

时间:2019-10-21 14:24:39

标签: android dagger-2 dagger

我在viewpager中有一个类DashboardActivity,其中有两个片段A和B。每个片段分别具有自己的ViewModelAViewModelBViewModel

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

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

请考虑将这些片段添加到应用程序的其他位置,以便附加活动在运行时可能有所不同。

这是我的操作方式:

AppComponent:

@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
    }
}

ActivityBindings:

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

DashboardModule:

@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

}

CommonActivityModule:

@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)
    }
}

PS。我需要能够从fragmentAfragmentB注入更多片段,因此它们也应充当AndroidInjectors

0 个答案:

没有答案