Как работать с подкомпонентами с помощью dagger2 в одном приложении активности? - PullRequest
1 голос
/ 16 марта 2020

Я пытаюсь использовать кинжал 2 в своем приложении. Приложение имеет только MainActivity и другой фрагмент, навигация которого осуществляется компонентом навигации. Я хочу, чтобы в приложении были разные подкомпоненты, такие как AuthSubcomponent, HomeSubcomponent. Чего я хочу добиться:

@ Singleton (root компонент) с 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>

}

ActivityModule

@Module(subcomponents = [AuthSubcomponent::class])
abstract class ActivityModule {

    @ContributesAndroidInjector
    abstract fun contributeMainActivity(): MainActivity

    @ContributesAndroidInjector
    abstract fun contributeTitleFragment(): TitleFragment
}

AppComponent

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

На этом этапе, как я могу добавить SignUpFragment, LoginFragment и VerificationFragment в AuthSubcomponent?

1 Ответ

0 голосов
/ 16 марта 2020

у вас должен быть другой 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
}

, для каждого подкомпонента у вас должна быть настраиваемая область действия

...