Eu tento fazer a arquitetura para obter um SwiftUI App maior e pronto para produção. Estou correndo o tempo todo com o mesmo problema que aponta para uma falha de design importante no SwiftUI.
Ainda assim, ninguém poderia me dar uma resposta completa, pronta para produção.
Como fazer vistas reutilizáveis nas SwiftUI
quais contêm navegação?
Como o SwiftUI
NavigationLink
aplicativo está fortemente vinculado à visualização, isso simplesmente não é possível, de forma que ele também é dimensionado em aplicativos maiores. NavigationLink
nessas pequenas amostras de aplicativos, sim - mas não assim que você deseja reutilizar muitas visualizações em um aplicativo. E talvez também reutilize além dos limites do módulo. (como: reutilizar a exibição no iOS, WatchOS etc.)
O problema do design: os NavigationLinks são codificados na Visualização.
NavigationLink(destination: MyCustomView(item: item))
Mas se a exibição que contém isso puderNavigationLink
ser reutilizada, não será possível codificar o destino. Tem que haver um mecanismo que forneça o destino. Perguntei isso aqui e obtive uma resposta muito boa, mas ainda não a resposta completa:
Coordenador SwiftUI MVVM / Roteador / NavigationLink
A idéia era injetar os Links de destino na exibição reutilizável. Geralmente, a ideia funciona, mas infelizmente isso não é dimensionado para aplicativos de produção reais. Assim que tenho várias telas reutilizáveis, encontro o problema lógico de que uma view reutilizável ( ViewA
) precisa de um destino de visualização pré-configurado ( ViewB
). Mas e se ViewB
também precisar de um destino de exibição pré-configurado ViewC
? Eu preciso criar ViewB
já de tal forma que ViewC
já é injetado em ViewB
antes de eu injetar ViewB
em ViewA
. E assim por diante ... mas como os dados que naquele momento precisam ser transmitidos não estão disponíveis, toda a construção falha.
Outra idéia que tive foi usar o Environment
mecanismo de injeção como dependência para injetar destinos NavigationLink
. Mas acho que isso deve ser considerado mais ou menos como um hack e não uma solução escalável para aplicativos grandes. Nós acabaríamos usando o Ambiente basicamente para tudo. Mas como o Ambiente também pode ser usado apenas dentro do View (não em coordenadores ou ViewModels separados), isso criaria novamente construções estranhas na minha opinião.
Assim como a lógica de negócios (por exemplo, ver código do modelo) e a visualização, também é necessário separar a navegação e a visualização (por exemplo, o padrão do coordenador). UIKit
É possível porque acessamos UIViewController
e UINavigationController
por trás da visualização. UIKit's
O MVC já teve o problema de juntar tantos conceitos que se tornou o nome divertido "Massive-View-Controller" em vez de "Model-View-Controller". Agora, um problema semelhante continua, SwiftUI
mas ainda pior na minha opinião. A navegação e as visualizações são fortemente acopladas e não podem ser dissociadas. Portanto, não é possível fazer visualizações reutilizáveis se elas contiverem navegação. Foi possível resolver isso, UIKit
mas agora não consigo ver uma solução sã noSwiftUI
. Infelizmente, a Apple não nos deu uma explicação sobre como resolver problemas de arquitetura como esse. Temos apenas alguns aplicativos de amostra pequenos.
Eu adoraria provar que estou errado. Mostre-me um padrão de design de aplicativo limpo que resolve isso para aplicativos prontos para grandes produções.
Desde já, obrigado.
Atualização: essa recompensa terminará em alguns minutos e, infelizmente, ainda ninguém foi capaz de fornecer um exemplo de trabalho. Mas vou iniciar uma nova recompensa para resolver esse problema se não encontrar outra solução e vinculá-la aqui. Obrigado a todos pela excelente contribuição!