Eines der aktuellsten Beispiele zu Android Architecture Components ist GithubBrowserSample von Google. Ich überprüfte den Code und einige Fragen entstanden:
Ich habe festgestellt, dass ViewModelModule ist in AppModule . Dies bedeutet, dass alle Ansichtsmodelle dem DI-Diagramm hinzugefügt werden. Warum wird das auf diese Weise gemacht, anstatt separate Module
für jede Aktivität / Fragment zu haben, die nur benötigte ViewModel
für spezifische Aktivität / Fragment liefern würde?
In diesem speziellen Beispiel werden Viewmodels mit GithubViewModelFactory Gibt es eine Möglichkeit, einen Parameter an die spezifische ViewModel
zu übergeben? Oder die bessere Lösung wäre, einen Setter in ViewModel
zu erstellen und den benötigten Parameter über Setter zu setzen?
- [...] Es bedeutet, dass alle View-Modelle zum DI-Graphen hinzugefügt werden. Warum das auf diese Weise gemacht wird, anstatt für jede Aktivität / jedes Fragment ein eigenes Modul zu haben?
Sie werden dem DI-Diagramm hinzugefügt, sie sind jedoch noch nicht erstellt. Stattdessen landen sie in einer Karte von Anbietern, wie im ViewModelFacory .
%Vor% Also haben wir jetzt eine GithubViewModelFactory
, die eine Liste von Anbietern hat und jede ViewModel
erstellen kann, die gebunden wurde. Fragmente und Aktivitäten können jetzt einfach die Factory einspeisen und ihr ViewModel abrufen.
Zum Warum ... Alternativ könnten Sie für jede Aktivität / jedes Fragment ein ViewModelProvider.Factory
erstellen und die Implementierung in jedem Modul registrieren. Dies wäre jedoch eine Menge duplicated Boilerplate-Code.
- In diesem speziellen Beispiel, in dem Viewmodels mit GithubViewModelFactory instanziiert werden, gibt es eine Möglichkeit, einen Parameter an das spezifische ViewModel zu übergeben? Oder die bessere Lösung wäre, einen Setter in ViewModel zu erstellen und den benötigten Parameter über Setter zu setzen?
Es scheint so, als ob alle ViewModels nur von @Singleton
-Objekten abhängen - was notwendig ist, da sie alle von der AppComponent bereitgestellt werden. Dies bedeutet, dass es keine Möglichkeit gibt andere "Parameter" als andere @Singleton
Abhängigkeiten zu übergeben.
Sie müssen also, wie Sie vorgeschlagen haben, die Factory entweder in die Aktivität / Fragment-Komponente verschieben, um Abhängigkeiten mit niedrigerem Bereich bereitzustellen, oder eine Setter-Methode verwenden.