Древовидная структура подкомпонента Dagger 2 - PullRequest
0 голосов
/ 07 марта 2019

Вопрос

Возможна ли древовидная структура субкомпонентов с фрагментными (@ContributesAndroidInjector) субкомпонентами с Dagger 2?Если да, то как можно отобразить сопоставленные Android-инжекторы на граф объектов (Dagger-android)?

Фон

Я пытаюсь создать древовидную структуру компонентовчтобы избежать необходимости передавать ссылки на объекты из класса в класс в моем приложении.Чтобы добиться этого, я попытался просмотреть документацию Подкомпонента Dagger 2, чтобы создать иерархию, но из-за запутанной / отсутствующей документации я не могу создать то, чего я пытаюсь достичь.

Я включаюмакет для продуманной архитектуры:

Application
|
| @ApplicationScope
| ApplicationComponent
---------------------------------------------------------------------------------------------
        |                                                                                   |
    @ActivityScope                                                                  @ActivityScope
    DiscussionsActivity                                                             ChatActivity
    -------------------------------------                                               ------------
    |                                   |
@FragmentScope                      @CategoryScope
DiscussionsCategoryListFragment     CategoryComponent
-------------------------------     -------------------------------------
                                    |                                   |
                                @FragmentScope                      @TopicScope
                                DiscussionsTopicListFragment        TopicComponent
                                ----------------------------        ---------------------------------------------
                                                                    |                                           |
                                                                @FragmentScope                              @FragmentScope
                                                                DiscussionsTopicDetailsFragment             DiscussionsTopicCommentsFragment

Я также добавляю макет дизайна для тех, кому нужно визуальное представление для дизайна.
Макет дизайна

Код

public class MyApplication extends DaggerApplication {

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent
                .builder()
                .application(this)
                .build();
    }
}

@ApplicationScope
@Component(modules = {
    ActivityBindingModule.class,
    AndroidSupportInjectionModule.class,
})
public interface AppComponent extends AndroidInjector<MyApplication> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }
}

@Module
public abstract class ActivityBindingModule {
    @ContributesAndroidInjector(modules = {
        DiscussionActivityModule.class,
        DiscussionActivityFragmentBindingModule.class,
    })
    abstract DiscussionActivity contributesDiscussionActivity();
}

@Module(subcomponent = CategoryComponent.class)
public abstract class DiscussionActivityModule {

    // How should I do to get the Fragments contributed in the
    // CategoryComponent and its subcomponent included in the AndroidInjector factory?

}

@Module
public abstract class DiscussionActivityFragmentBindingModule {
    @FragmentScope
    @ContributesAndroidInjector(modules = DiscussionsCategoryListFragmentModule.class)
    abstract DiscussionsCategoryListFragment contributesDiscussionsCategoryListFragment();
}

@CategoryScope
@Subcomponent(modules = {
    CategoryFragmentBindingModule.class,
}
public interface CategoryComponent {

    @Subcomponent.Builder
    interface Builder {
        Builder categoryModule(@Category long categoryId);
        CategoryComponent build();
    }
}

@Module
public abstract class CategoryFragmentBindingModule {

    // How do I make this map entry available for the
    // Map<Class<? extends Fragment>, AndroidInjector.Factory<? extends Fragment>> fragmentInjector factory?

    @FragmentScope
    @ContributesAndroidInjector(modules = DiscussionsTopicListFragmentModule.class)
    abstract DiscussionsTopicListFragment contributesDiscussionsTopicListFragment();
}

Хорошо, так что я могу включить больше кода или объяснить, что там в настоящее время по запросу.

EDIT1: исправлена ​​опечатка.

...