Intento hacer la arquitectura para una aplicación SwiftUI más grande y lista para producción. Me encuentro todo el tiempo con el mismo problema que apunta a una falla de diseño importante en SwiftUI.
Todavía nadie podía darme una respuesta completa, lista para la producción.
¿Cómo hacer vistas reutilizables SwiftUI
que contengan navegación?
Como SwiftUI
NavigationLink
está fuertemente vinculado a la vista, esto simplemente no es posible de tal manera que se amplíe también en aplicaciones más grandes. NavigationLink
en esas pequeñas aplicaciones de muestra funciona, sí, pero no tan pronto como quiera reutilizar muchas vistas en una aplicación. Y tal vez también reutilizar sobre los límites del módulo. (como: reutilizar View en iOS, WatchOS, etc.)
El problema de diseño: los enlaces de navegación están codificados en la vista.
NavigationLink(destination: MyCustomView(item: item))
Pero si la vista que contiene esto NavigationLink
es reutilizable, no puedo codificar el destino. Tiene que haber un mecanismo que proporcione el destino. Pregunté esto aquí y obtuve una respuesta bastante buena, pero aún no es la respuesta completa:
Coordinador / Enrutador / NavigationLink de SwiftUI MVVM
La idea era inyectar los enlaces de destino en la vista reutilizable. En general, la idea funciona, pero desafortunadamente no se adapta a las aplicaciones de producción reales. Tan pronto como tengo varias pantallas reutilizables, me encuentro con el problema lógico de que una vista reutilizable ( ViewA
) necesita un destino de vista preconfigurado ( ViewB
). Pero, ¿y si ViewB
también necesita un destino de vista preconfigurado ViewC
? Yo tendría que crear ViewB
ya de tal manera que ViewC
ya se inyecta en ViewB
antes de inyectar ViewB
en ViewA
. Y así sucesivamente ... pero como los datos que en ese momento deben pasarse no están disponibles, la construcción completa falla.
Otra idea que tuve fue utilizar el Environment
mecanismo de inyección como dependencia para inyectar destinos NavigationLink
. Pero creo que esto debería considerarse más o menos como un truco y no como una solución escalable para aplicaciones grandes. Terminaríamos usando el entorno básicamente para todo. Pero debido a que el entorno también se puede usar solo dentro de las vistas (no en coordinadores o modelos de vista separados), esto crearía construcciones extrañas en mi opinión.
Al igual que la lógica de negocios (por ejemplo, ver el código del modelo) y la vista deben estar separadas, también la navegación y la vista deben estar separadas (por ejemplo, el patrón Coordinador). UIKit
Es posible porque accedemos a la vista UIViewController
y UINavigationController
detrás de ella. UIKit's
MVC ya tenía el problema de que combinaba tantos conceptos que se convirtió en el nombre divertido "Massive-View-Controller" en lugar de "Model-View-Controller". Ahora continúa un problema similar SwiftUI
pero peor en mi opinión. La navegación y las vistas están fuertemente acopladas y no se pueden desacoplar. Por lo tanto, no es posible hacer vistas reutilizables si contienen navegación. Fue posible resolver esto en UIKit
pero ahora no puedo ver una solución sensata enSwiftUI
. Desafortunadamente, Apple no nos dio una explicación sobre cómo resolver problemas de arquitectura como ese. Tenemos solo algunas pequeñas aplicaciones de muestra.
Me encantaría que me demuestren lo contrario. Muéstrame un patrón de diseño de aplicaciones limpio que resuelva esto para aplicaciones grandes listas para producción
Gracias por adelantado.
Actualización: esta recompensa terminará en unos minutos y desafortunadamente aún nadie pudo proporcionar un ejemplo de trabajo. Pero comenzaré una nueva recompensa para resolver este problema si no puedo encontrar otra solución y vincularla aquí. ¡Gracias a todos por su gran contribución!