J'essaie de faire l'architecture d'une application SwiftUI plus grande et prête pour la production. Je rencontre tout le temps le même problème qui pointe vers un défaut majeur de conception dans SwiftUI.
Personne ne pouvait toujours me donner une réponse complète, prête pour la production.
Comment faire des vues réutilisables dans SwiftUIlesquelles contiennent la navigation?
Comme le SwiftUI NavigationLinkest fortement lié à la vue, cela n'est tout simplement pas possible de telle sorte qu'il évolue également dans les applications plus grandes. NavigationLinkdans ces petits exemples d'applications, oui - mais pas dès que vous souhaitez réutiliser de nombreuses vues dans une seule application. Et peut-être aussi réutiliser au-delà des limites des modules. (comme: réutiliser View dans iOS, WatchOS, etc ...)
Le problème de conception: les liens de navigation sont codés en dur dans la vue.
NavigationLink(destination: MyCustomView(item: item))
Mais si la vue contenant ceci NavigationLinkdoit être réutilisable, je ne peux pas coder en dur la destination. Il doit y avoir un mécanisme qui fournit la destination. J'ai posé cette question ici et j'ai obtenu une assez bonne réponse, mais toujours pas la réponse complète:
SwiftUI MVVM Coordinator / Router / NavigationLink
L'idée était d'injecter les liens de destination dans la vue réutilisable. En général, l'idée fonctionne, mais malheureusement, cela ne s'adapte pas aux vraies applications de production. Dès que j'ai plusieurs écrans réutilisables, je rencontre le problème logique qu'une vue réutilisable ( ViewA) a besoin d'une vue-destination préconfigurée ( ViewB). Mais que se passe-t-il si vous ViewBavez également besoin d'une destination de vue préconfigurée ViewC? Je besoin de créer ViewBdéjà de telle sorte que l' ViewCon injecte déjà ViewBavant que j'injecter ViewBdans ViewA. Et ainsi de suite .... mais comme les données qui à ce moment doivent être transmises ne sont pas disponibles, la construction entière échoue.
Une autre idée que j'avais était d'utiliser le Environmentmécanisme d'injection comme dépendance pour injecter des destinations NavigationLink. Mais je pense que cela devrait être considéré plus ou moins comme un hack et non comme une solution évolutive pour les grandes applications. Nous finirions par utiliser l'environnement essentiellement pour tout. Mais comme l'environnement ne peut également être utilisé qu'à l' intérieur de View (pas dans des coordinateurs ou des ViewModels séparés), cela créerait à nouveau des constructions étranges à mon avis.
Comme la logique métier (par exemple, voir le code du modèle) et la vue doivent être séparées, la navigation et la vue doivent être séparées (par exemple le modèle de coordinateur). C'est UIKitpossible parce que nous accédons à UIViewControlleret UINavigationControllerderrière la vue. UIKit'sMVC avait déjà le problème de mélanger tellement de concepts qu'il devint le nom amusant "Massive-View-Controller" au lieu de "Model-View-Controller". Maintenant, un problème similaire persiste, SwiftUImais encore pire à mon avis. La navigation et les vues sont fortement couplées et ne peuvent pas être découplées. Il n'est donc pas possible de faire des vues réutilisables si elles contiennent de la navigation. Il était possible de résoudre ce problème, UIKitmais maintenant je ne vois pas de solution sensée dansSwiftUI. Malheureusement, Apple ne nous a pas expliqué comment résoudre de tels problèmes architecturaux. Nous avons juste quelques petits exemples d'applications.
J'adorerais avoir tort. Veuillez me montrer un modèle de conception d'application propre qui résout ce problème pour les grandes applications prêtes pour la production.
Merci d'avance.
Mise à jour: cette prime se terminera dans quelques minutes et malheureusement, personne n'a encore été en mesure de fournir un exemple de travail. Mais je vais commencer une nouvelle prime pour résoudre ce problème si je ne trouve pas d'autre solution et le lier ici. Merci à tous pour leur grande contribution!