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 SwiftUIdenen Navigation enthalten ist?
Da das SwiftUI NavigationLinkstark an die Ansicht gebunden ist, ist dies einfach nicht so möglich, dass es auch in größeren Apps skaliert. NavigationLinkIn 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 ViewBauch ein vorkonfiguriertes Ansichtsziel benötigt wird ViewC? Ich würde erstellen müssen ViewBbereits in einer solchen Art und Weise , die ViewCin bereits eingespritzt wird , ViewBbevor ich spritze ViewBin 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 EnvironmentMechanismus 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 UIKitist möglich, weil wir auf UIViewControllerund UINavigationControllerhinter der Ansicht zugreifen . UIKit'sMVC 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, SwiftUIaber 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, UIKitaber 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!