如何将Dagger2的子组件用于GWT
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将Dagger2的子组件用于GWT相关的知识,希望对你有一定的参考价值。
我正在尝试将两个组件与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能够将子组件注入其图形中,我想让子组件选择要使用的实现。是否可以使用子组件?我误解了什么?
Dagger中的组件代表“范围”,即生命周期。你的MainView
依赖于CarteWidget
,因此它的生命周期(必然)比小部件的生命周期长。这将导致视图位于子组件和父组件中的窗口小部件中,而不是相反(或在同一组件中)。
如果你想要隔离,那么使用组件依赖而不是子组件;但你试图在这里向后绑定事物。
真正的问题是:为什么要使用子组件,甚至是单独的组件?
以上是关于如何将Dagger2的子组件用于GWT的主要内容,如果未能解决你的问题,请参考以下文章
GWT 没有可用于类型 [userClassName] 的源代码
Android Dagger片段可以访问AppModule和ActivityModule依赖关系,但不能访问FragmentModule依赖关系