Кинжал 2: ImagesRepo не может быть предоставлен без конструктора @Inject или @Provides - PullRequest
0 голосов
/ 28 сентября 2018

Я предоставляю ImagesRepo с использованием RepoModule, ImgesReo зависит от RxApiController и SharePreferenceHelper, и я предоставляю эти зависимости в самом RepoModule, эти зависимости происходят от AppModule.

@Module(includes = AppModule.class)
public class RepoModule {

    @Provides
    @Inject
    public ImagesRepo providesImagesRepo(RxApiController rxApiController, SharePreferenceHelper sharePreferenceHelper) {
        return new ImagesRepo(rxApiController, sharePreferenceHelper);
    }
}

Когда я пытаюсь внедрить ImagesRepo, как это

@Inject
    public ImagesRepo imagesRepo;


    public MyActivityViewmodelImpl() {
        MyApplication.getRepoComponent().inject(this);
    }

Это показывает ошибку, если я удаляю @Inject из конструктора ImagesRepo, я думаю, что я предоставляю RxApiController и SharePreferenceHelperfrom RepoModule

@Inject
public ImagesRepo(RxApiController rxApiController, SharePreferenceHelper sharePreferenceHelper) {
    super(rxApiController, sharePreferenceHelper);
}

Вопрос в том, почему я должен добавить конструктор @Inject в ImagesRepo, если я предоставляю зависимости для ImagesRepo в RepoModule самом

1 Ответ

0 голосов
/ 30 сентября 2018

Чтобы избежать ошибок и путаницы, вы должны понимать, что делает каждая аннотация.@Provides метод не нуждается в аннотации @Inject.Здесь вы могли бы даже использовать инжектор конструктора в одиночку, и вам не понадобился бы метод @Provides (или модуль) вообще, что уменьшило бы необходимое количество шаблонов.

Что касается вашей конкретной ошибки, я быПредположим, что вы либо не добавляете RepoModule к своему компоненту, либо пытаетесь внедрить в ваш класс неправильный компонент (у которого нет доступа к RepoModule).


Добавление @Inject на конструкторе ImagesRepo помечает его для внедрения в конструктор, так что Dagger может и создаст его для вас .Нет необходимости в модуле (который вы не добавили / компонент не может получить к нему доступ), поэтому он будет «работать» при этом.

Чтобы избежать путаницы и ошибок, используйте *В методе 1019 * из модуля или используется инжектор конструктора - предпочтительно инжектор конструктора, который устранит шаблон, что является одной из причин, по которой вы в первую очередь используете Dagger.

...