我尝试为更大的,可投入生产的SwiftUI App做架构。我一直在遇到一个相同的问题,这表明SwiftUI的一个主要设计缺陷。
仍然没有人能给我完整的工作,生产就绪的答案。
如何在SwiftUI
其中包含导航的可重用视图?
由于SwiftUI
NavigationLink
牢固地绑定在视图上,因此根本不可能在较大的Apps中进行缩放。NavigationLink
是的,在这些小样本应用程序中可以工作-是的,但是当您要在一个应用程序中重用许多视图时就不会立即使用。并且可能还会在模块边界上重用。(例如:在iOS,WatchOS等中重用View)
设计问题:NavigationLinks硬编码到视图中。
NavigationLink(destination: MyCustomView(item: item))
但是,如果包含此视图的视图NavigationLink
应该可重用,则无法对目的地进行硬编码。必须有一种提供目的地的机制。我在这里问这个问题,得到了很好的答案,但仍然没有完整的答案:
SwiftUI MVVM协调器/路由器/ NavigationLink
想法是将目标链接注入到可重用视图中。通常,此想法可行,但不幸的是,这并不适合实际的Production Apps。一旦有了多个可重复使用的屏幕,我就会遇到一个逻辑问题,即一个可重复使用的视图(ViewA
)需要一个预先配置的视图目标(ViewB
)。但是,如果ViewB
还需要预配置的视图目标该ViewC
怎么办?我需要建立ViewB
在这样的方式已经ViewC
被注入已经ViewB
在我注入ViewB
到ViewA
。依此类推....但是由于当时必须传递的数据不可用,整个构造失败了。
我的另一个想法是使用Environment
as依赖项注入机制为注入目标NavigationLink
。但是我认为,这或多或少应被视为一种骇客行为,而不是针对大型应用程序的可扩展解决方案。我们最终将基本上将环境用于所有内容。但是因为Environment也只能在View内部使用(不能在单独的Coordinators或ViewModels中使用),所以我认为这将再次创建奇怪的构造。
就像业务逻辑(例如,视图模型代码)和视图一样,导航和视图也必须分开(例如,协调器模式)。UIKit
这是有可能的,因为我们可以访问视图UIViewController
并UINavigationController
在视图后方进行访问。UIKit's
MVC已经存在一个问题,即它混和了许多概念,因此变成了有趣的名称“ Massive-View-Controller”而不是“ Model-View-Controller”。现在,类似的问题仍在继续,SwiftUI
但在我看来甚至更糟。导航和视图是紧密耦合的,不能分离。因此,如果包含导航,则无法进行可重用的视图。可以解决这个问题,UIKit
但是现在我看不到一个理智的解决方案SwiftUI
。不幸的是,Apple没有向我们提供如何解决类似架构问题的解释。我们只有一些小示例应用程序。
我希望证明自己是错误的。请给我展示一个干净的App设计模式,该模式可以解决大量生产就绪的Apps的问题。
提前致谢。
更新:悬赏活动将在几分钟后结束,很遗憾,仍然没有人能够提供有效的示例。但是,如果找不到其他解决方案并将其链接到此处,我将开始提供新的赏金来解决此问题。感谢大家的巨大贡献!