Я пытаюсь сделать архитектуру для более крупного, готового к использованию приложения SwiftUI. Я все время сталкиваюсь с одной и той же проблемой, которая указывает на серьезный недостаток дизайна в SwiftUI.
Еще никто не мог дать мне полный рабочий, готовый к производству ответ.
Как сделать многоразовые представления, в SwiftUI
которых содержится навигация?
Поскольку SwiftUI
NavigationLink
он сильно привязан к представлению, это просто невозможно, чтобы оно масштабировалось и в более крупных приложениях. NavigationLink
Да, в этих небольших примерах приложения работают, но не сразу, если вы хотите повторно использовать несколько представлений в одном приложении. И, возможно, также повторно использовать границы модуля. (например, повторное использование View в iOS, WatchOS и т. д.)
Проблема дизайна: ссылки NavigationLink жестко закодированы в View.
NavigationLink(destination: MyCustomView(item: item))
Но если представление, содержащее это, NavigationLink
должно быть повторно использовано, я не могу жестко закодировать место назначения. Должен быть механизм, который обеспечивает пункт назначения. Я спросил это здесь и получил довольно хороший ответ, но все еще не полный ответ:
SwiftUI MVVM Координатор / Маршрутизатор / NavigationLink
Идея заключалась в том, чтобы добавить целевые ссылки в многоразовое представление. Обычно идея работает, но, к сожалению, она не масштабируется для реальных производственных приложений. Как только у меня появляется несколько экранов многократного использования, я сталкиваюсь с логической проблемой, что одному повторно используемому представлению ( ViewA
) требуется предварительно сконфигурированный view-destination ( ViewB
). Но что, если ViewB
также необходимо предварительно сконфигурированное представление-назначение ViewC
? Мне нужно было создать ViewB
уже таким образом , что ViewC
впрыскивается уже ViewB
перед тем, как вводить ViewB
в ViewA
. И так далее ... но поскольку данные, которые должны быть переданы в это время, недоступны, вся конструкция не работает.
Еще одна идея, которая у меня была, заключалась в том, чтобы использовать Environment
механизм внедрения зависимостей для внедрения мест назначения NavigationLink
. Но я думаю, что это следует рассматривать более или менее как взлом, а не масштабируемое решение для больших приложений. В конечном итоге мы бы использовали Среду в основном для всего. Но поскольку Environment также можно использовать только внутри View (не в отдельных координаторах или ViewModels), это, на мой взгляд, снова приведет к созданию странных конструкций.
Как бизнес-логика (например, код модели представления) и представление должны быть разделены, так и навигация и представление должны быть разделены (например, шаблон Координатора). UIKit
Это возможно, потому что мы имеем доступ к представлению UIViewController
и UINavigationController
за ним. UIKit's
У MVC уже была проблема, заключающаяся в том, что он смешал так много понятий, что стал забавным названием «Massive-View-Controller» вместо «Model-View-Controller». Сейчас похожая проблема сохраняется, SwiftUI
но, на мой взгляд, еще хуже. Навигация и Виды сильно связаны и не могут быть отделены. Поэтому невозможно сделать повторно используемые представления, если они содержат навигацию. Это можно было решить, UIKit
но сейчас я не вижу разумного решения вSwiftUI
, К сожалению, Apple не предоставила нам объяснения, как решать подобные архитектурные проблемы. Мы получили только несколько небольших примеров приложений.
Я хотел бы быть доказанным неправым. Пожалуйста, покажите мне чистый шаблон дизайна приложения, который решает эту проблему для готовых приложений.
Заранее спасибо.
Обновление: эта награда закончится через несколько минут, и, к сожалению, до сих пор никто не смог привести рабочий пример. Но я начну новую награду, чтобы решить эту проблему, если я не могу найти другое решение и связать его здесь. Спасибо всем за их большой вклад!