Я начал использовать 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;
}
}
Второй модуль выглядит следующим образом: он предоставляет презентатор/контроллер и их зависимости для подмножества пользовательского интерфейса на экране:
@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, но он существует! Если я заменю неявное создание экземпляра NavigationListControllerImpl (передавая через параметр @Provides
-method) с явным (с new
), кинжал начинает жаловаться на ту же ошибку, но теперь для объекта-презентатора, который является второй записью в том же модуле, и и так далее.
Вся эта ситуация выглядит очень странно, и я хотел бы услышать некоторые материалы от более опытных пользователей Dagger 2 (и разработчиков?).
Заранее благодарю вас!