Я предполагаю, что текущую ошибку будет легко исправить, потому что она очень похожа на эту проблему.
Вы указали Dagger, как предоставить @AScope CategoryContract.CategoryPresenter
, но в активности, которую вы запрашиваетеКинжал для введения CategoryContract.CategoryPresenter
.Кинжал в замешательстве, потому что эти две вещи не совпадают.
Вам нужно просто добавить @AScope
к categoryPresenter
:
@Inject
@AScope
CategoryPresenter categoryPresenter;
Я проверил ваш проект .Проблема была в NetComponent.java
:
@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetComponent {
void inject(MainActivity activity);
}
Проблема в строке void inject(MainActivity activity)
.Почему это проблема?Поскольку к тому времени, когда вы создаете NetComponent
в App
, кинжал анализирует MainActivity
для @Inject
аннотированного поля и видит CategoryPresenter
.Это означает, что в этот момент Dagger должен найти подходящий метод провайдера / связывателя, чтобы иметь возможность внедрить MainActivity
, как объявлено внутри этого интерфейса.
Но он не может найти такой метод провайдера / связывателя, потому что онобъявлен в другом компоненте - CategoryPresenterComponent
, и этот компонент (NetComponent
) так или иначе не связан с CategoryPresenterComponent
(подкомпонентами или зависимостями компонентов), поэтому привязки не отображаются.
Простое удаление этой строки приведет ксделайте вашу сборку успешной:
@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetComponent {
}
Для устранения «Ошибка: невозможно получить доступ к Nullable» см. этот поток , который предлагает применить compile 'com.google.code.findbugs:jsr305:3.0.2'
кВаш файл Gradle.
После этого вы преодолеете это сообщение об ошибке и наткнетесь на retrofit2.Retrofit cannot be provided without an @Inject constructor or an @Provides-annotated method
, который имеет те же симптомы, что и CategoryPresenter
.
Чтобы преодолеть эту проблему, вынеобходимо добавить метод Retrofit
провайдера внутри NetComponent
(или удалить @Inject Retrofit retrofit
из активности):
@Singleton
@Component(modules = {ApplicationModule.class, NetworkModule.class})
public interface NetComponent {
Retrofit providesRetrofit();
}
После этого вы сможете запустить приложение, но выв итоге яНа NPE в MainActivity
, из-за этой строки:
.categoryContractModule(new CategoryContractModule(retrofit.create(HeadyAPI.class)))
Вы имеете в виду объект retrofit
, который еще не инициализирован.
Короче говоря, ваш первоначальный вопрос имеетмутировал пару раз, и на самом деле у вас было несколько проблем в вашем коде.Тем не менее, у вас есть проблема, потому что вы пытаетесь использовать retrofit
для создания компонента, который должен был ввести retrofit
для вас.