Tôi cố gắng thực hiện kiến trúc cho một ứng dụng SwiftUI lớn hơn, sẵn sàng sản xuất. Tôi luôn luôn gặp phải vấn đề tương tự, điều này chỉ ra một lỗ hổng thiết kế lớn trong SwiftUI.
Vẫn không ai có thể cho tôi một câu trả lời sẵn sàng làm việc, sản xuất.
Làm thế nào để thực hiện Lượt xem có thể sử dụng lại trong SwiftUIđó có điều hướng?
Vì SwiftUI NavigationLinkliên kết chặt chẽ với chế độ xem, điều này chỉ đơn giản là không thể theo cách mà nó cũng mở rộng trong Ứng dụng lớn hơn. NavigationLinktrong các ứng dụng mẫu nhỏ đó hoạt động, có - nhưng không phải ngay khi bạn muốn sử dụng lại nhiều Chế độ xem trong một Ứng dụng. Và cũng có thể tái sử dụng trên các ranh giới mô-đun. (như: sử dụng lại Chế độ xem trong iOS, WatchOS, v.v ...)
Vấn đề thiết kế: NavigationLinks được mã hóa cứng vào View.
NavigationLink(destination: MyCustomView(item: item))
Nhưng nếu chế độ xem chứa mục này NavigationLinkcó thể được sử dụng lại, tôi không thể mã hóa đích đến. Phải có một cơ chế cung cấp đích đến. Tôi đã hỏi điều này ở đây và nhận được một câu trả lời khá tốt, nhưng vẫn không có câu trả lời đầy đủ:
SwiftUI MVVM Điều phối viên / Bộ định tuyến / NavigationLink
Ý tưởng là đưa các Liên kết Đích vào chế độ xem có thể sử dụng lại. Nói chung, ý tưởng hoạt động nhưng thật không may, điều này không mở rộng thành Ứng dụng sản xuất thực sự. Ngay khi tôi có nhiều màn hình có thể sử dụng lại, tôi gặp phải vấn đề logic rằng một chế độ xem có thể sử dụng lại ( ViewA) cần một chế độ xem đích được cấu hình sẵn ( ViewB). Nhưng điều gì sẽ xảy ra nếu ViewBcũng cần một điểm đến được cấu hình sẵn ViewC? Tôi sẽ cần phải tạo ra ViewBmột cách đã ViewCđược tiêm ViewBtrước khi tôi tiêm ViewBvào ViewA. Và như vậy .... nhưng vì dữ liệu tại thời điểm đó phải được thông qua là không có sẵn, toàn bộ cấu trúc thất bại.
Một ý tưởng khác mà tôi có là sử dụng Environmentcơ chế tiêm phụ thuộc để tiêm đích NavigationLink. Nhưng tôi nghĩ rằng điều này nên được coi ít nhiều là một hack và không phải là một giải pháp có thể mở rộng cho các Ứng dụng lớn. Chúng tôi cuối cùng sẽ sử dụng Môi trường cho tất cả mọi thứ. Nhưng vì Môi trường cũng có thể được sử dụng chỉ trong Xem lý lịch thành (không phải trong điều phối viên hoặc ViewModels riêng) này một lần nữa sẽ tạo ra cấu trúc kỳ lạ trong quan điểm của tôi.
Giống như logic nghiệp vụ (ví dụ: mã mô hình chế độ xem) và chế độ xem phải được tách riêng, điều hướng và chế độ xem phải được tách riêng (ví dụ: mẫu Điều phối viên) UIKitCó thể vì chúng tôi truy cập vào UIViewControllervà UINavigationControllerphía sau chế độ xem. UIKit'sMVC đã có vấn đề là nó đã trộn lẫn rất nhiều khái niệm để nó trở thành cái tên vui nhộn "Massive-View-Controller" thay vì "Model-View-Controller". Bây giờ một vấn đề tương tự tiếp tục trong SwiftUInhưng theo tôi thậm chí còn tồi tệ hơn. Điều hướng và Chế độ xem được kết hợp chặt chẽ và không thể tách rời. Do đó, không thể thực hiện các chế độ xem có thể sử dụng lại nếu chúng có chứa điều hướng. Có thể giải quyết vấn đề này UIKitnhưng bây giờ tôi không thể thấy một giải pháp lành mạnh trongSwiftUI. Thật không may, Apple đã không cung cấp cho chúng tôi một lời giải thích làm thế nào để giải quyết các vấn đề kiến trúc như thế. Chúng tôi chỉ có một số Ứng dụng mẫu nhỏ.
Tôi rất thích được chứng minh là sai. Vui lòng chỉ cho tôi một mẫu thiết kế Ứng dụng sạch sẽ giải quyết điều này cho các Ứng dụng sẵn sàng sản xuất lớn.
Cảm ơn trước.
Cập nhật: tiền thưởng này sẽ kết thúc sau vài phút và thật không may vẫn không ai có thể cung cấp một ví dụ hoạt động. Nhưng tôi sẽ bắt đầu một tiền thưởng mới để giải quyết vấn đề này nếu tôi không thể tìm thấy bất kỳ giải pháp nào khác và liên kết nó ở đây. Cảm ơn tất cả những đóng góp tuyệt vời của họ!