我开始使用Dagger 2,并遇到一个奇怪的问题,看起来像是一个bug。
我有3个模块,它们组成了一个子组件,该子组件又扩展/增加了更高级别的组件。
子组件非常简单:只是模块的组合和一个单一的注入点:
@Singleton
@Subcomponent(
modules = {
NavigationDrawerModule.class,
NavigationListModule.class,
SwitcherModule.class
}
)
public interface NavigationDrawerComponent {
NavigationDrawerFragment inject(NavigationDrawerFragment object);
}
第一个模块看起来像这样-它提供一般的片段级别依赖关系:
@Module
public class NavigationDrawerModule {
private final Activity activity;
private final View rootView;
private final LoaderManager loaderManager;
public NavigationDrawerModule(Activity activity, View rootView, LoaderManager loaderManager) {
this.activity = activity;
this.rootView = rootView;
this.loaderManager = loaderManager;
}
@Provides @Singleton EventBus provideLocalBus() {
return EventBus.builder().build();
}
@Provides @Singleton View provideViewRoot() {
return rootView;
}
@Provides @Singleton LoaderManager provideLoaderManager() {
return loaderManager;
}
@Provides @Singleton Context provideContext() {
return activity;
}
}
第二个模块看起来像这样 - 它为屏幕上的一部分UI提供了展示器/控制器及其依赖项:
@Module
public class SwitcherModule {
@Provides SwitchController provideSwitcherController(SwitchControllerImpl impl) {
return impl;
}
@Provides SwitcherView provideSwitcherView(SwitcherViewImpl impl) {
return impl;
}
}
第三个模块 - 为UI的一个子集提供另一个展示者/控制器:
@Module
public class NavigationListModule {
@Provides @Singleton NavigationListController provideNavigationListController(NavigationListControllerImpl impl) {
return impl;
}
@Provides @Singleton NavigationListView provideNavigationListView(NavigationListViewImpl impl) {
return impl;
}
}
被注入的片段中相关的部分:
@Inject SwitchController identitySwitchController;
@Inject SwitcherView identitySwitcherView;
@Inject NavigationListController navigationListController;
@Inject NavigationListView navigationListView;
NavigationListControllerImpl
实现了以下构造函数:
@Inject
public NavigationListControllerImpl(Context ctx, EventBus bus) {
this.ctx = ctx;
this.bus = bus;
}
我从Dagger 2编译器收到的错误信息如下:
error: ...sidenavigation.navigationlist.NavigationListControllerImpl cannot be provided without an @Inject constructor or from an @Provides-annotated method.
...sidenavigation.NavigationDrawerFragment.navigationListController
[injected field of type: ...sidenavigation.navigationlist.NavigationListController navigationListController]
...sidenavigation.navigationlist.NavigationListModule.provideNavigationListController(...sidenavigation.navigationlist.NavigationListControllerImpl impl)
[parameter: ...sidenavigation.navigationlist.NavigationListControllerImpl impl]
错误提示缺少带有@Inject注解的构造函数,但实际上已经存在!如果我用显式创建NavigationListControllerImpl实例(使用@Provides
方法参数传递)替换隐式创建,那么dagger就会开始报同样的错误,但这次是针对同一模块中的第二个presenter对象,以此类推。
所有这些情况看起来非常奇怪,我想听听更有经验的Dagger 2用户(和开发者)的看法。
提前感谢您!