2016-06-20 11 views
1

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.

Antwort

1

@Inject -annotated Konstruktor ist eine Alternative zu einer @Provides -annotated Methode für eine Abhängigkeit, wenn nicht viel Konfiguration zu tun ist.

Da HelloPresenter über einen solchen Konstruktor verfügt, entdeckt Dagger es automatisch und kann diese Abhängigkeit injizieren oder zum Konstruieren und Bereitstellen anderer Objekte im Diagramm verwenden.

Eine Klasse mit einem @Inject -annotated-Konstruktor kann selbst mit einer Bereichsanmerkung versehen werden (z. B. @Singleton). In diesem Fall können nur Komponenten mit dem entsprechenden Bereich angezeigt werden.

Im Allgemeinen ist diese Art der Bereitstellung von Abhängigkeiten weniger ausführlich, aber nicht immer können Sie sie verwenden (z. B. Activity, SharedPreferences). In solchen Fällen müssen Sie mit einer @Module und einer @Provides Methode gehen.

+0

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

+1

@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

+0

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

Verwandte Themen