我正在尝试将两个组件与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能够将Subcomponent注入到它的图形中,并且我想让Subcomponent选择要使用的实现。子组件可能吗?我误会了什么?
答案 0 :(得分:1)
Dagger中的组件表示“作用域”,也就是生命周期。您的MainView
依赖于CarteWidget
,因此其生命周期(必须)比小部件的生命周期更长。这将导致视图位于子组件中,而窗口小部件位于父组件中,而不是相反(或两者都在同一组件中)。
如果要隔离,请使用组件依赖性而不是子组件;但是您正在尝试将内容向后绑定。
真正的问题是:为什么要使用子组件,甚至是单独的组件?