Xamarin.Forms Prism Navigation überarbeitet

Im letzten Artikel haben wir uns einen Überblick über die Navigation in Xamarin.Forms und Prism verschafft. Aus den dort angesprochenen Gründen wollen wir uns hier mit einem Service befassen, der um den Prism NavigationService eine typisierte Hülle legt. Dabei wird die gesamte Navigationslogik einer App in einer Klasse zusammengefasst, die anstelle des NavigationService in die ViewModels injiziert wird. Das Entscheidende dabei ist, für jeden Navigationsvorgang eine eigene Methode mit den vom Navigationsziel benötigten Daten als Parameter anzubieten.

Abbildung 1: Xamarin.Forms Prism Navigation überarbeitet / Bildquelle: Stefan Fritz, generic.de AG

Abbildung 2: Xamarin.Forms Prism Navigation überarbeitet / Bildquelle: Stefan Fritz, generic.de AG

Dadurch sind alle Abhängigkeiten von den Views an einer Stelle zusammengefasst und die ViewModels wurden davon befreit.

Abbildung 3: Xamarin.Forms Prism Navigation überarbeitet / Bildquelle: Stefan Fritz, generic.de AG

Als Zwischenfazit können wir festhalten, dass wir nur durch das Extrahieren der Navigation aus den ViewModels folgendes erreicht haben:

  • Keine Abhängigkeit mehr von den Views (Namen) in den ViewModels
  • Implementierungsdetails der Navigation sind an einer Stelle gekapselt
  • Die vom Navigationsziel benötigten Daten werden typisiert erzwungen

In unserem Navigator, den wir per Interface von den ViewModels entkoppelt haben, können wir uns jetzt Abhängigkeiten von den Views erlauben. Darum können wir die Strings mit den View-Namen durch nameof()-Aufrufe ersetzen und sind an der Stelle vor Tippfehlern und Namensänderungen sicher:

Abbildung 4: Xamarin.Forms Prism Navigation überarbeitet / Bildquelle: Stefan Fritz, generic.de AG

Aber auch seitens des Navigationsziels besteht noch Raum für Verbesserungen.

Hier verwenden wir bisher die Funktionen, die uns der NavigationService bietet.

Abbildung 5: Xamarin.Forms Prism Navigation überarbeitet / Bildquelle: Stefan Fritz, generic.de AG

Hier können wir die Typsicherheit und den Komfort bei Verwendung des Navigators durch ein paar kleine Änderungen weiter erhöhen.
Dazu verwenden wir zwischen Navigator und Ziel Kontextklassen zur Übergabe der Parameter. Diese Klassen definieren auch ihre Keys, unter denen sie in den NavigationParameter abgelegt werden.

Abbildung 6: Xamarin.Forms Prism Navigation überarbeitet / Bildquelle: Stefan Fritz, generic.de AG

Unser Navigator muss damit nur noch sicherstellen, dass der richtige Kontext für die jeweilige Navigation erstellt wird.

Abbildung 7: Xamarin.Forms Prism Navigation überarbeitet / Bildquelle: Stefan Fritz, generic.de AG

Abbildung 8: Xamarin.Forms Prism Navigation überarbeitet / Bildquelle: Stefan Fritz, generic.de AG

Durch diese Änderungen haben wir einen typsicheren, testbaren und einfach erweiterbaren Navigator, der die Details der Navigation vor den Konsumenten verbergen kann.
Mit einer entsprechenden Implementierung des Navigators lässt sich natürlich auch die Standardnavigation von Xamarin.Forms auf gleiche Weise kapseln. Das auszuprobieren überlasse ich nun aber Ihrer eigenen Kreativität.

29.11.2018 von Stefan, generic.de AG