Ich versuche, meinen Kopf um den Einsatz von Dolch 2 in meinem Projekt mit Retrofit, RxJava, MVP-Implementierung zu wickeln. Allerdings fange ich klein an, indem ich Guides lese und Videos gucke und gerade als ich dachte, ich hätte verstanden, wie es funktioniert, scheint es, dass ich es nicht tue. Here ist die Probe, die ich versuche zu verstehen.Das Verständnis des Dagger2 Flow (Beispiel zur Verfügung gestellt)
Modul:
@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;
}
Komponente
@Component(
modules = AppModule.class
)
@Singleton
public interface AppComponent {
HelloModel getHelloModel();
HelloDiskCache getHelloDiskCache();
MainActivity inject(MainActivity activity);
HelloFragment inject(HelloFragment fragment);
}
Im Fragment wird Moderator injiziert (wo ist das her?)
@Inject HelloPresenter presenter;
Und in dem Moderator, gibt es eine Konstruktoreinspritzung
@Inject HelloPresenter(HelloModel helloModel) {
this.model = helloModel;
}
Also, wie kommen wir einen Moderator in dem Fragment injizieren kann, und warum können wir in den Präsentator spritzen? Die Antwort muss nicht sehr ausführlich sein Ich fühle mich einfach dumm, weil ich nicht nachvollziehen kann, woher es kommt.
Hmm Ich sehe, nach dem Durchlaufen einiger Tutorials hatte ich den Eindruck, dass alle Orte, wo die Injektion stattfinden wird, in der Komponente erwähnt werden müssen, aber das gilt nur für wo Sie App.getAppComponent aufrufen (getActivity()). inject (this) in das Fragment zum Beispiel. Ich denke, mein Problem ist zu verstehen, warum ich @Inject in Klassen verwenden kann, die nicht in der Komponente sind, und nicht die inject-Sache in oncreate. – buddhabath
@buddhabath Es kann einige Verwirrung über die Verwendung von '@ Inject'-Annotation für Felder und Konstruktoren geben, die sehr unterschiedlich sind. Wenn Sie ein * Feld * mit '@ Inject' annotieren, müssen Sie' App.getAppComponent (getActivity()). Inject (this) 'aufrufen, um diese Abhängigkeit zu erfüllen. Auf der anderen Seite, wenn Sie einen Konstruktor annotieren, sagen Sie Dagger, dass er diesen Konstruktor verwenden kann, wenn er diese Klasse in seinen Graphenerstellungsaktivitäten benötigt. Es gibt keine Möglichkeit, '... inject (this)' in einer 'Activity' nicht aufzurufen, da Sie keinen Zugriff auf seinen Konstruktor haben und seine Felder nicht als Konstruktorparameter angeben können. – AndroidEx
Eine weitere tolle Sache bei annotierten Konstruktoren mit dem Namen "@ Inject" ist, dass ihre Parameter automatisch aus dem Diagramm bereitgestellt werden und Sie diese normalerweise zum Füllen Ihrer Klassenfelder verwenden. In Ihrem Beispiel wird 'HalloModell' in' HalloPresenter (HalloModell HalloModell) 'von' provideHelloModel() 'innerhalb der Komponente bereitgestellt, da beide Abhängigkeitsprovider für die Komponente sichtbar sind. – AndroidEx