如何在单个 activity 应用程序上使用 dagger2 处理子组件?
How to handle subcomponents with dagger2 on single activity app?
我正在尝试在我的应用程序中使用 Dagger 2。该应用程序只有 MainActivity 和不同的片段,导航由导航组件实现。我想在整个应用程序中使用不同的子组件,例如 AuthSubcomponent、HomeSubcomponent。
我想要实现的是:
@Singleton(根组件)与 MainActivity
@AuthSubcomponent(@Singleton 的子组件)与 TitleFragment、SignUpFragment、LoginFragment、VerificationFragment
@HomeSubcomponent(@Singleton 的子组件)与 HomeFragment、ProfileFragment
当我必须将不同的片段粘合在一起并使它们成为同一子组件的一部分时,问题就来了。例如,TitleFragment、SignUpFragment、LoginFragment 和 VerificationFragment 都必须是 AuthSubcomponent 的一部分。但是,当我按照dagger2文档编写子组件时,只能是一个片段。
示例:
子组件
@FiScope
@Subcomponent
interface AuthSubcomponent : AndroidInjector<TitleFragment> {
@Subcomponent.Factory
interface Factory: AndroidInjector.Factory<TitleFragment>
}
活动模块
@Module(subcomponents = [AuthSubcomponent::class])
abstract class ActivityModule {
@ContributesAndroidInjector
abstract fun contributeMainActivity(): MainActivity
@ContributesAndroidInjector
abstract fun contributeTitleFragment(): TitleFragment
}
应用组件
@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, ActivityModule::class])
interface AppComponent {
@Component.Factory
interface Factory{
fun create(@BindsInstance application: Application): AppComponent
}
fun inject(app: BaseApplication)
fun authSubcomponent(): AuthSubcomponent.Factory
}
此时如何在AuthSub组件中添加SignUpFragment、LoginFragment、VerificationFragment?
你应该有另一个 AuthFragmentModule 并将其安装在 AuthSubcomponent 上,
@FiScope
@Subcomponent(modules =[AuthFragmentModule::class])
interface AuthSubcomponent : AndroidInjector<TitleFragment> {
@Subcomponent.Factory
interface Factory: AndroidInjector.Factory<TitleFragment>
}
在 AuthFragmentModule 中你应该添加
@Moudle
class AuthFragmentModule{
//add the fragments LoginFragment and singupFragment here
@FiScope
@ContributesAndroidInjector
abstract fun contributeTitleFragment(): TitleFragment
}
对于每个子组件,您应该有一个自定义范围
我正在尝试在我的应用程序中使用 Dagger 2。该应用程序只有 MainActivity 和不同的片段,导航由导航组件实现。我想在整个应用程序中使用不同的子组件,例如 AuthSubcomponent、HomeSubcomponent。 我想要实现的是:
@Singleton(根组件)与 MainActivity
@AuthSubcomponent(@Singleton 的子组件)与 TitleFragment、SignUpFragment、LoginFragment、VerificationFragment
@HomeSubcomponent(@Singleton 的子组件)与 HomeFragment、ProfileFragment
当我必须将不同的片段粘合在一起并使它们成为同一子组件的一部分时,问题就来了。例如,TitleFragment、SignUpFragment、LoginFragment 和 VerificationFragment 都必须是 AuthSubcomponent 的一部分。但是,当我按照dagger2文档编写子组件时,只能是一个片段。
示例:
子组件
@FiScope
@Subcomponent
interface AuthSubcomponent : AndroidInjector<TitleFragment> {
@Subcomponent.Factory
interface Factory: AndroidInjector.Factory<TitleFragment>
}
活动模块
@Module(subcomponents = [AuthSubcomponent::class])
abstract class ActivityModule {
@ContributesAndroidInjector
abstract fun contributeMainActivity(): MainActivity
@ContributesAndroidInjector
abstract fun contributeTitleFragment(): TitleFragment
}
应用组件
@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, ActivityModule::class])
interface AppComponent {
@Component.Factory
interface Factory{
fun create(@BindsInstance application: Application): AppComponent
}
fun inject(app: BaseApplication)
fun authSubcomponent(): AuthSubcomponent.Factory
}
此时如何在AuthSub组件中添加SignUpFragment、LoginFragment、VerificationFragment?
你应该有另一个 AuthFragmentModule 并将其安装在 AuthSubcomponent 上,
@FiScope
@Subcomponent(modules =[AuthFragmentModule::class])
interface AuthSubcomponent : AndroidInjector<TitleFragment> {
@Subcomponent.Factory
interface Factory: AndroidInjector.Factory<TitleFragment>
}
在 AuthFragmentModule 中你应该添加
@Moudle
class AuthFragmentModule{
//add the fragments LoginFragment and singupFragment here
@FiScope
@ContributesAndroidInjector
abstract fun contributeTitleFragment(): TitleFragment
}
对于每个子组件,您应该有一个自定义范围