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.