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 SwiftUI
lesquelles contiennent la navigation?
Comme le SwiftUI
NavigationLink
est fortement lié à la vue, cela n'est tout simplement pas possible de telle sorte qu'il évolue également dans les applications plus grandes. NavigationLink
dans 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 NavigationLink
doit ê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 ViewB
avez également besoin d'une destination de vue préconfigurée ViewC
? Je besoin de créer ViewB
déjà de telle sorte que l' ViewC
on injecte déjà ViewB
avant que j'injecter ViewB
dans 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 Environment
mé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 UIKit
possible parce que nous accédons à UIViewController
et UINavigationController
derrière la vue. UIKit's
MVC 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, SwiftUI
mais 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, UIKit
mais 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!