Как использовать подкомпонент Dagger2 в GWT - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь связать два компонента с Dagger2 (версия 2.17). Один - это вид активности GWT (MainView.class), а другой - сложный виджет, в который встроены некоторые функции отображения (CarteWidget.class).

Я хотел бы определить действие как @Component, которое содержит, в частности, @Subcomponent, чтобы содержать зависимости CarteWidget.

Вот мой основной компонент и его модуль:

@Lvl1Scope
@Component(modules = Lvl1Module.class)
public interface Lvl1Component {

    MainView getMainView();

}

@Module(subcomponents = CarteSubComponent.class)
public class MainModule {

    @Provides
    public MainView provideMainView (CarteSubComponent.Builder carteBuilder) {
        return new MainView (carteBuilder.build().getCarte());
    }
}

И мой подкомпонент и его модуль:

@CarteScope
@Subcomponent(modules = CarteModule.class)
public interface CarteSubComponent {

    CarteWidget getCarte();

    @Subcomponent.Builder
    interface Builder {

        CarteSubComponent build();
    }

    @Module
    public class CarteModule {

    }

}

Это работает, но мне это не нравится, я предпочел внедрить мой CarteWidget в мой MainView без использования метода @Provides. Так что мой основной модуль содержит только способ получить CarteWidget из подкомпонента:

@Module(subcomponents = CarteSubComponent.class)
public class Lvl1Module {

    @Provides
    public CarteWidget provideCarte(CarteSubComponent.Builder carteBuilder) {
        return carteBuilder.build().getCarte();
    }

}

Но с этим очень небольшим изменением я получил бесконечный цикл , потому что метод provideCarte Lvl1Module вызывается при выполнении carteBuilder.build().getCarte() ...

Если я добавляю метод-производитель CarteWidget в свой подкомпонент, я получаю сообщение об ошибке, что для типа CarteWidget найдены две привязки, это правда.

Мне нужно, чтобы мой Lvl1Component мог внедрить субкомпонент в свой график, и я хочу позволить субкомпоненту выбрать реализацию для использования. Это возможно с субкомпонентом? Что я не так понял?

1 Ответ

0 голосов
/ 10 сентября 2018

Компоненты в Dagger представляют собой «области видимости», или жизненный цикл. Ваш MainView зависит от CarteWidget, поэтому его жизненный цикл (обязательно) дольше, чем у виджета. Это приведет к тому, что представление будет в подкомпоненте, а виджет в родительском компоненте, а не наоборот (или оба в одном и том же компоненте).

Если вы хотите изолировать, то используйте зависимости компонентов, а не подкомпоненты; но вы пытаетесь связать вещи назад.

Реальный вопрос: почему вы хотите использовать подкомпоненты или даже отдельные компоненты?

...