Ich versuche, die Architektur für eine größere, produktionsbereite SwiftUI-App zu erstellen. Ich stoße ständig auf das gleiche Problem, das auf einen großen Designfehler in SwiftUI hinweist.
Trotzdem konnte mir niemand eine voll funktionsfähige, produktionsbereite Antwort geben.
Wie mache ich wiederverwendbare Ansichten, in SwiftUI
denen Navigation enthalten ist?
Da das SwiftUI
NavigationLink
stark an die Ansicht gebunden ist, ist dies einfach nicht so möglich, dass es auch in größeren Apps skaliert. NavigationLink
In diesen kleinen Beispielen funktionieren Apps zwar - aber nicht, sobald Sie viele Ansichten in einer App wiederverwenden möchten. Und vielleicht auch über Modulgrenzen hinweg wiederverwenden. (wie: Wiederverwendung von View in iOS, WatchOS usw.)
Das Designproblem: NavigationLinks sind in der Ansicht fest codiert.
NavigationLink(destination: MyCustomView(item: item))
Aber wenn die Ansicht, die dies enthält NavigationLink
, wiederverwendbar sein sollte, kann ich das Ziel nicht fest codieren . Es muss einen Mechanismus geben, der das Ziel bereitstellt. Ich habe das hier gefragt und eine ziemlich gute Antwort bekommen, aber immer noch nicht die vollständige Antwort:
SwiftUI MVVM-Koordinator / Router / NavigationLink
Die Idee war, die Ziel-Links in die wiederverwendbare Ansicht einzufügen. Im Allgemeinen funktioniert die Idee, aber leider lässt sich dies nicht auf echte Produktions-Apps skalieren. Sobald ich mehrere wiederverwendbare Bildschirme habe, stoße ich auf das logische Problem, dass eine wiederverwendbare Ansicht ( ViewA
) ein vorkonfiguriertes Ansichtsziel ( ViewB
) benötigt. Was aber, wenn ViewB
auch ein vorkonfiguriertes Ansichtsziel benötigt wird ViewC
? Ich würde erstellen müssen ViewB
bereits in einer solchen Art und Weise , die ViewC
in bereits eingespritzt wird , ViewB
bevor ich spritze ViewB
in ViewA
. Und so weiter ... aber da die Daten, die zu diesem Zeitpunkt übergeben werden müssen, nicht verfügbar sind, schlägt das gesamte Konstrukt fehl.
Eine andere Idee, die ich hatte, war, den Environment
Mechanismus der Abhängigkeitsinjektion zu verwenden, um Ziele für zu injizieren NavigationLink
. Ich denke jedoch, dass dies mehr oder weniger als Hack und nicht als skalierbare Lösung für große Apps betrachtet werden sollte. Wir würden die Umwelt grundsätzlich für alles nutzen. Da die Umgebung jedoch auch nur innerhalb von Views verwendet werden kann (nicht in separaten Koordinatoren oder ViewModels), würde dies meiner Meinung nach wiederum seltsame Konstrukte erzeugen.
Wie Geschäftslogik (z. B. Ansichtsmodellcode) und Ansicht müssen auch Navigation und Ansicht getrennt werden (z. B. das Koordinatormuster). Dies UIKit
ist möglich, weil wir auf UIViewController
und UINavigationController
hinter der Ansicht zugreifen . UIKit's
MVC hatte bereits das Problem, dass es so viele Konzepte zusammenbrachte, dass es zum lustigen Namen "Massive-View-Controller" anstelle von "Model-View-Controller" wurde. Jetzt geht ein ähnliches Problem weiter, SwiftUI
aber meiner Meinung nach noch schlimmer. Navigation und Ansichten sind stark gekoppelt und können nicht entkoppelt werden. Daher ist es nicht möglich, wiederverwendbare Ansichten zu erstellen, wenn diese eine Navigation enthalten. Es war möglich, dies zu lösen, UIKit
aber jetzt sehe ich keine vernünftige Lösung inSwiftUI
. Leider hat Apple uns keine Erklärung gegeben, wie wir solche Architekturprobleme lösen können. Wir haben nur einige kleine Beispiel-Apps.
Ich würde gerne das Gegenteil beweisen. Bitte zeigen Sie mir ein sauberes App-Design-Muster, das dieses Problem für große produktionsreife Apps löst.
Danke im Voraus.
Update: Diese Prämie endet in wenigen Minuten und leider konnte noch niemand ein funktionierendes Beispiel liefern. Aber ich werde eine neue Prämie starten, um dieses Problem zu lösen, wenn ich keine andere Lösung finde und sie hier verlinke. Vielen Dank an alle für ihren tollen Beitrag!