Я пытаюсь обернуть голову вокруг использования Dagger 2 в моем проекте с помощью Retrofit, RxJava, MVP. Тем не менее, я начинаю с малого, читая руководства и смотря видео, и когда я думал, что понял, как это работает, похоже, я этого не делаю. Here - образец, который я пытаюсь понять.Понимание потока Dagger2 (пример предоставлен)
Модуль:
@Module
public class AppModule {
private App app;
public AppModule(App app) {
this.app = app;
}
@Provides @Singleton public SharedPreferences provideSharedPreferences() {
return PreferenceManager.getDefaultSharedPreferences(app);
}
@Provides @Singleton public HelloModel provideHelloModel(SchedulerProvider schedulerProvider,
HelloDiskCache helloDiskCache, HelloService helloService, Clock clock) {
return new HelloModel(schedulerProvider, helloDiskCache, helloService, clock);
}
@Provides public HelloDiskCache provideHelloDiskCache(SharedPreferences prefs) {
return new HelloDiskCache(prefs);
}
@Provides public HelloService provideHelloService() {
return new HelloService();
}
@Provides public SchedulerProvider provideSchedulerProvider() {
return SchedulerProvider.DEFAULT;
}
@Provides public Clock provideClock() {
return Clock.REAL;
}
@Provides @Nullable public LayoutInflaterFactory provideLayoutInflaterFactory() {
return null;
}
Компонент
@Component(
modules = AppModule.class
)
@Singleton
public interface AppComponent {
HelloModel getHelloModel();
HelloDiskCache getHelloDiskCache();
MainActivity inject(MainActivity activity);
HelloFragment inject(HelloFragment fragment);
}
В фрагменте, ведущий впрыскивается (где это приходит?)
@Inject HelloPresenter presenter;
И ведущий, есть инжектор конструктора
@Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;
}
Итак, как же мы можем придать выступающие во фрагменте, и поэтому мы можем привнести в ведущем? Ответ не должен быть очень сложным, я просто чувствую себя глупо, потому что я не могу отследить, откуда он.
Хм, я вижу, после прохождения некоторых уроков у меня создалось впечатление, что все места, где происходит инъекция, должны упоминаться в Компоненте, но это относится только к тому, где вы звоните, например, App.getAppComponent (getActivity()). Вставьте (это) в фрагмент, например. Я думаю, что моя проблема заключается в понимании, почему я могу использовать @Inject в классах, которые не находятся в Компоненте, и не делает инъекционную вещь в oncreate. – buddhabath
@buddhabath Может возникнуть некоторая путаница в отношении использования аннотаций @ @ Inject для полей и конструкторов, которые совершенно разные. Когда вы аннотируете * поле * с помощью '@ Inject', вам нужно вызвать' App.getAppComponent (getActivity()). Inject (this) ', чтобы удовлетворить эту зависимость. С другой стороны, когда вы комментируете конструктор, вы говорите кинжалу, что он может использовать этот конструктор, если ему когда-либо понадобится этот класс в своих действиях по созданию графика. Невозможно не вызывать '... inject (this)' в 'Activity', потому что у вас нет доступа к его конструктору и не может предоставить свои поля в качестве параметров конструктора. – AndroidEx
Еще одна замечательная вещь в аннотированных конструкторах '@ Inject' заключается в том, что ее параметры предоставляются автоматически из графика, и вы обычно используете их для заполнения полей вашего класса. В вашем примере 'helloModel' в' HelloPresenter (HelloModel helloModel) 'предоставляется из' обеспеченияHelloModel() 'внутри компонента, поскольку оба этих поставщика зависимостей видны компоненту. – AndroidEx