2017-12-06 1 views
0

Gibt es einen Weg in Dagger2 oder in Dagger2 Android Injection Unterstützung, um die Member-Instanzen zu injizieren, ohne die Klassennamen der Fragmente anzugeben.Verwenden Sie Dagger2 Android Injection Support ohne Angabe des Klassennamens

Ich habe ein modulares Projekt, bei dem

Die folgende Zeile ein Bindemittel Fabrik für die injizierbare Klasse zu bieten bittet.

@Override 
    public void onAttach(Context context) { 
     AndroidSupportInjection.inject(this); 
     super.onAttach(context); 
    } 

Aber meine Absicht ist es, die Injektion Mitglieder durch verschiedene Module in dem Projekt zur Verfügung zu stellen, wo das würde ich nicht überhaupt die Klassennamen des Fragments angeben.

Ist dies in Dagger2 Injektion möglich oder nicht?

Antwort

0

Gibt es einen Weg in Dagger2 oder in Dagger2 Android Injection Unterstützung, um die Mitglieder Instanzen ohne Angabe der Klassennamen der Fragmente zu injizieren.

tl; dr Nein, Sie brauchen immer eine Komponente, die eine .inject(FragmentInQuestion fragment) Methode für jedes Fragment enthält, die Sie injizieren wollen.


Dolch verwendet Anmerkung Verarbeitung bei der Kompilierung alle Ihre .inject(SomeFragment fragment) Methoden zu lösen, wo es Felder mit @Inject kommentierten schaut auf und schafft Code sie zu injizieren.

Es benötigt den tatsächlichen Klassennamen, da es nur Code für die Klasse generiert, die mit seinen Feldern verwendet wird.

Eine generische Komponente deklarieren, die alle Ihre Fragmente injiziert, ist unmöglich.
.inject(Fragment fragment) würde keine Eigenschaften injizieren, da Fragment keine @Inject annotierte Felder enthält. So würde keiner der dep Felder in der obigen Probe zur Verfügung gestellt werden und sie beide wären null.

Sie könnte eine BaseFragment erstellen, die gemeinsame Objekte enthält und eine Injektion für sie schreiben, aber auch hier würde alle kommentierten Felder ihrer Kinder nicht versorgt werden.

Sie könnten andere Problemumgehungen versuchen, aber am Ende würde es immer bedeuten, dass Sie injizieren oder mit einem Basistyp arbeiten würden. Während dies in einige Situationen möglich sein könnte, glaube ich nicht, dass es an mehr als einigen speziellen Randfällen arbeiten würde.


Der Android-Injection Teil Dagger 2 nimmt diesen Ansatz und schafft eine generische Schnittstelle, die Ihre Komponenten zusammen mit einem Builder zu implementieren haben die in Rede stehenden Art zu binden.

interface AndroidInjector<T> { 
    inject(T instance) 
} 

Durch diese Schnittstelle implementieren AndroidInjection kann dann aussehen (und erstellen), um die richtige Komponente und Ihr Fragment zu injizieren.Aus den oben genannten Gründen ist dies immer die tatsächliche Klasse Ihres Fragments und nicht irgendein Basistyp.

Mit dem Android-Injection-Teil können Sie also keine gemeinsame Basisklasse verwenden, und selbst ohne diese wäre es Ihnen schwer gefallen.


Wenn Sie einen Weg nun das Anruf von AndroidInjection.inject(this) woanders Sie im Google Android Architecture Components sample Projekt aussehen sollten bewegen, wo sie FragmentLifecycleCallbacks verwenden, um die Fragmente global zur richtigen Zeit zu injizieren.

Verwandte Themen