Я намагаюся зробити архітектуру для більшого, готового до виробництва 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's
MVC вже мав проблему, що він переплутав так багато понять, що він став найменуванням забави "Massive-View-Controller" замість "Model-View-Controller". Зараз подібна проблема триває, SwiftUI
але на мою думку ще гірше. Навігація та Перегляди сильно поєднані і не можуть бути роз'єднані. Тому неможливо робити перегляди для багаторазового використання, якщо вони містять навігацію. Це можна було вирішити, UIKit
але зараз я не бачу розумного рішенняSwiftUI
. На жаль, Apple не дала нам пояснення, як вирішити подібні архітектурні питання. У нас є лише кілька невеликих прикладних програм.
Я хотів би, щоб він був неправильним. Покажіть мені, чистий шаблон дизайну додатків, який вирішує це для великих програм, готових до виробництва.
Заздалегідь спасибі.
Оновлення: цей виграш закінчиться через кілька хвилин, і, на жаль, досі ніхто не зміг надати робочий приклад. Але я розпочну нову винагороду, щоб вирішити цю проблему, якщо не зможу знайти іншого рішення і зв’яжу його тут. Дякуємо всім за великий внесок!