Я намагаюся зробити архітектуру для більшого, готового до виробництва SwiftUI додатка. Я весь час стикаюся з тією ж проблемою, яка вказує на головний недолік дизайну в SwiftUI.
Ще ніхто не міг дати мені повну робочу, готову відповідь.
Як зробити перегляди для багаторазового використання, в SwiftUIяких міститься навігація?
Оскільки SwiftUI NavigationLinkце суворо пов'язане з представленням даних, це просто неможливо таким чином, що він масштабується і у великих додатках. NavigationLinkу цих невеликих зразках Apps працює, так - але не відразу, коли ви хочете повторно використовувати багато переглядів в одному додатку. А може бути також повторне використання за межами модулів. (наприклад: повторне використання перегляду в iOS, WatchOS тощо).
Проблема дизайну: Навігаційні посилання жорстко кодуються у Перегляд.
NavigationLink(destination: MyCustomView(item: item))
Але якщо перегляд, що містить це, NavigationLinkповинен бути багаторазовим, я не можу жорстко кодувати місце призначення. Має бути механізм, який забезпечує призначення. Я запитав це тут і отримав досить хорошу відповідь, але все ж не повну відповідь:
SwiftUI Координатор MVVM / Маршрутизатор / НавігаціяLink
Ідея полягала в тому, щоб ввести цільові посилання у перегляд для багаторазового використання. Як правило, ідея працює, але, на жаль, це не досягає реальних виробничих додатків. Як тільки у мене є кілька екранів для багаторазового використання, я стикаюся з логічною проблемою, що для одного виду повторного використання ( ViewA) потрібна попередньо налаштована панель перегляду ( ViewB). Але що робити, якщо ViewBтакож потрібен попередньо налаштований вид перегляду ViewC? Мені потрібно створити ViewBвже таким чином, що ViewCвводиться вже до того, ViewBяк я вводяться ViewBв ViewA. І так далі .... але оскільки дані, які на той момент потрібно передавати, недоступні, вся конструкція виходить з ладу.
Іншою ідеєю у мене було використання Environmentмеханізму введення залежності для введення пунктів призначення NavigationLink. Але я думаю, що це слід вважати більш-менш хакером, а не масштабним рішенням для великих додатків. Ми врешті-решт використовуємо Середовище в основному для всього. Але оскільки середовище також можна використовувати лише всередині View (а не в окремих координаторах чи ViewModels), це, на мою думку, знову створить дивні конструкції.
Як і бізнес-логіка (наприклад, код моделі перегляду), і перегляд повинні бути розділені, і навігація та перегляд повинні бути відокремлені (наприклад, шаблон Координатора). UIKitЦе можливо, тому що ми отримуємо доступ до UIViewControllerта UINavigationControllerпоза ним. UIKit'sMVC вже мав проблему, що він переплутав так багато понять, що він став найменуванням забави "Massive-View-Controller" замість "Model-View-Controller". Зараз подібна проблема триває, SwiftUIале на мою думку ще гірше. Навігація та Перегляди сильно поєднані і не можуть бути роз'єднані. Тому неможливо робити перегляди для багаторазового використання, якщо вони містять навігацію. Це можна було вирішити, UIKitале зараз я не бачу розумного рішенняSwiftUI. На жаль, Apple не дала нам пояснення, як вирішити подібні архітектурні питання. У нас є лише кілька невеликих прикладних програм.
Я хотів би, щоб він був неправильним. Покажіть мені, чистий шаблон дизайну додатків, який вирішує це для великих програм, готових до виробництва.
Заздалегідь спасибі.
Оновлення: цей виграш закінчиться через кілька хвилин, і, на жаль, досі ніхто не зміг надати робочий приклад. Але я розпочну нову винагороду, щоб вирішити цю проблему, якщо не зможу знайти іншого рішення і зв’яжу його тут. Дякуємо всім за великий внесок!