我已经开始使用 Dagger 2 并遇到了一个奇怪的问题,这对我来说似乎是一个错误。
我有 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-annotated 构造函数,但它存在!@Provides
如果我用显式(with )替换隐式 NavigationListControllerImpl 实例创建(通过-method 参数传递new
),dagger 开始抱怨相同的错误,但现在是相同模块中的第二个条目的演示者对象,依此类推。
所有这些情况看起来都很奇怪,我想听听更有经验的 Dagger 2 用户(和开发人员?)的一些意见。
先感谢您!