Cerco di realizzare l'architettura per un'app SwiftUI più grande e pronta per la produzione. Sto correndo continuamente nello stesso problema che indica un grosso difetto di progettazione in SwiftUI.
Ancora nessuno poteva darmi una risposta completa, pronta per la produzione.
Come fare visualizzazioni riutilizzabili in SwiftUI
cui contiene la navigazione?
Dato che SwiftUI
NavigationLink
è fortemente legato alla vista, ciò non è semplicemente possibile in modo tale da ridimensionarsi anche in App più grandi. NavigationLink
in quelle piccole app di esempio funziona, sì, ma non appena si desidera riutilizzare molte visualizzazioni in un'unica app. E forse anche riutilizzare oltre i confini del modulo. (come: riutilizzare Visualizza in iOS, WatchOS, ecc ...)
Il problema di progettazione: i NavigationLink sono codificati nella vista.
NavigationLink(destination: MyCustomView(item: item))
Ma se la vista che contiene questo NavigationLink
dovesse essere riutilizzabile, non posso codificare la destinazione. Ci deve essere un meccanismo che fornisce la destinazione. Ho chiesto questo qui e ho ottenuto una buona risposta, ma ancora non la risposta completa:
SwiftUI MVVM Coordinator / Router / NavigationLink
L'idea era quella di iniettare i collegamenti di destinazione nella vista riutilizzabile. Generalmente l'idea funziona, ma sfortunatamente questo non si adatta alle vere app di produzione. Non appena ho più schermate riutilizzabili mi imbatto nel problema logico che una vista riutilizzabile ( ViewA
) necessita di una vista-destinazione preconfigurata ( ViewB
). E se fosse ViewB
necessaria anche una destinazione vista preconfigurata ViewC
? Avrei bisogno di creare ViewB
già in modo tale che ViewC
viene iniettato già ViewB
prima di iniettare ViewB
in ViewA
. E così via .... ma poiché i dati che a quel tempo devono essere passati non sono disponibili, l'intero costrutto fallisce.
Un'altra idea che ho avuto è stata quella di utilizzare il Environment
meccanismo di iniezione di dipendenza per iniettare destinazioni NavigationLink
. Ma penso che questo dovrebbe essere considerato più o meno come un hack e non una soluzione scalabile per grandi app. Finiremmo per usare l'ambiente praticamente per tutto. Ma poiché anche l'ambiente può essere utilizzato solo all'interno di View (non in coordinatori o ViewModels separati), secondo me ciò creerebbe di nuovo strane costruzioni.
Come la logica aziendale (ad esempio il codice del modello di visualizzazione) e la vista devono essere separate, anche la navigazione e la vista devono essere separate (ad esempio il modello di coordinatore). UIKit
È possibile perché accediamo alla vista UIViewController
e UINavigationController
dietro la vista. UIKit's
MVC aveva già il problema di aver combinato così tanti concetti da diventare il nome divertente "Massive-View-Controller" anziché "Model-View-Controller". Ora un problema simile continua SwiftUI
ma, a mio avviso, anche peggio. La navigazione e le viste sono fortemente accoppiate e non possono essere disaccoppiate. Pertanto non è possibile eseguire visualizzazioni riutilizzabili se contengono navigazione. È stato possibile risolvere questo problema, UIKit
ma ora non riesco a vedere una soluzione sana inSwiftUI
. Purtroppo Apple non ci ha fornito una spiegazione su come risolvere problemi di architettura del genere. Abbiamo solo alcune piccole app di esempio.
Mi piacerebbe essere smentito. Vi prego di mostrarmi un modello di progettazione di app pulito che risolva questo problema per le app di grande produzione pronte.
Grazie in anticipo.
Aggiornamento: questa taglia finirà tra pochi minuti e purtroppo nessuno è stato in grado di fornire un esempio funzionante. Ma inizierò una nuova ricompensa per risolvere questo problema se non riesco a trovare un'altra soluzione e collegarla qui. Grazie a tutti per l'ottimo contributo!