私は、より大きな、本番環境対応のSwiftUIアプリのアーキテクチャーを作ろうとしています。私はいつもSwiftUIの主要な設計上の欠陥を指摘する同じ問題に遭遇しています。
それでも、誰も私に完全に機能する、生産準備の整った答えを与えることができませんでした。
SwiftUI
ナビゲーションを含む再利用可能なビューを行う方法は?
以下のようSwiftUI
NavigationLink
強くビューにバインドされ、これは、それが大きなアプリにもスケールするように、単純に不可能です。NavigationLink
これらの小さなサンプルアプリでは機能します、はい。また、モジュールの境界を越えて再利用することもできます。(例:iOS、WatchOSなどでViewを再利用する...)
設計上の問題:NavigationLinksはビューにハードコードされています。
NavigationLink(destination: MyCustomView(item: item))
しかし、これNavigationLink
を含むビューが再利用可能である場合、宛先をハードコーディングすることはできません。宛先を提供するメカニズムが必要です。私はここでこれを尋ね、かなり良い答えを得ましたが、それでも完全な答えではありません:
SwiftUI MVVMコーディネーター/ルーター/ NavigationLink
アイデアは、宛先リンクを再利用可能なビューに挿入することでした。一般にこのアイデアは機能しますが、残念ながら、これは実際のプロダクションアプリに拡張できません。複数の再利用可能な画面が表示されるとすぐに、1つの再利用可能なビュー(ViewA
)に事前構成されたビューの宛先(ViewB
)が必要であるという論理的な問題が発生します。しかしViewB
、事前に構成されたビューの宛先も必要な場合はどうViewC
でしょうか。に注入する前に、すでに注入されてViewB
いる方法で作成する必要があります。などなど...しかし、そのときに渡されなければならないデータが利用できないため、構造全体が失敗します。ViewC
ViewB
ViewB
ViewA
私が持っていたもう1つのアイデアはEnvironment
、依存関係注入メカニズムとしてを使用しての宛先を注入することでしたNavigationLink
。しかし、これは多かれ少なかれハックとして考える必要があり、大規模なアプリのスケーラブルなソリューションではないと思います。基本的にはすべてに環境を使用することになります。しかし、EnvironmentもView内でのみ使用できるため(別個のCoordinatorsやViewModelsでは使用できません)、これもまた、奇妙な構造を作成すると思います。
ビジネスロジック(例えばビューモデルコード)とビューのようにもナビゲーションを分離する必要があり、(例えばコーディネーターパターン)を分離する必要がビューUIKit
我々がアクセスするため、それが可能だUIViewController
とUINavigationController
ビューの後ろに。UIKit's
MVCには、「Model-View-Controller」ではなく「Massive-View-Controller」というおもしろい名前になるほど多くの概念がまとまってしまうという問題がすでにありました。現在、同様の問題が続いてSwiftUI
いますが、私の意見ではさらに悪化しています。ナビゲーションとビューは強く結合されており、分離することはできません。したがって、ナビゲーションが含まれている場合、再利用可能なビューを実行することはできません。これを解決することは可能でしたUIKit
が、今では正気な解決策を見ることができませんSwiftUI
。残念ながら、Appleはそのようなアーキテクチャ上の問題を解決する方法を説明しませんでした。いくつかの小さなサンプルアプリを入手しました。
私は間違っていると証明されたいです。大規模な本番環境対応アプリでこれを解決するクリーンなアプリデザインパターンを見せてください。
前もって感謝します。
更新:この賞金は数分で終了しますが、残念ながら、まだ誰も実例を提供できませんでした。しかし、他の解決策が見つからず、ここにリンクできない場合は、この問題を解決するための新しい報奨金を開始します。彼らの多大な貢献に感謝します!