Tsudzukeru
@Tsudzukeru

Нужно ли объявлять субкомпоненты внутри компонента dagger?

Обратил внимание, что в коде используется объявления субкомпонентов в модуле subcomponents.
Видел и другие примеры, где этого не делают (компоненты и субкомпоненты никак не связаны). Что данный модуль дает приложению?

@Singleton
@Component(
    modules = [
        AppModule::class,
        AppModuleBinds::class,
        ViewModelBuilderModule::class,
        SubcomponentsModule::class
    ]
)
interface AppComponent {

    @Component.Factory
    interface Factory {
        fun create(@BindsInstance applicationContext: Context): AppComponent
    }

    fun addEditTaskComponent(): AddEditTaskComponent.Factory
    fun statisticsComponent(): StatisticsComponent.Factory
    fun taskDetailComponent(): TaskDetailComponent.Factory
    fun tasksComponent(): TasksComponent.Factory

    val tasksRepository: TasksRepository
}

@Module(
    subcomponents = [
        TasksComponent::class,
        AddEditTaskComponent::class,
        StatisticsComponent::class,
        TaskDetailComponent::class
    ]
)
object SubcomponentsModule
  • Вопрос задан
  • 51 просмотр
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Таким способом ты можешь сказать даггеру, что этот сабкомпонент будет сабом именно к конкретному (или нескольким) компонентам. Это может быть полезно, если ты его(или его фабрику/билдер) хочешь не получать руками из компонента, а заинжектить.
Например:
@SubComponent
interface MySubComponent{
...
}

@Module(subcomponents=[MySubComponent::class])
interface SubcomponentsModule

@Component(modules=[SubcomponentsModule::class])
interface MyComponent{
  fun inject(what: MyClass)
}

class MyClass{
  @Inject 
  lateinit var subcomponent:. MySubComponent

  fun inject (){
    // Инжектим с помощью MyComponent
  }


В этом случае не нужно в интерфейсе компонента писать функцию, возвращающую сабкомпонент.
А если ты хочешь писать такую функцию, и дергать её руками непосредственно из компонента, то в модуле можно не перечислять.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы