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
NavigationLink
liê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. NavigationLink
trong 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 NavigationLink
có 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 ViewB
cũ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 ViewB
một cách đã ViewC
được tiêm ViewB
trước khi tôi tiêm ViewB
và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 Environment
cơ 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) UIKit
Có thể vì chúng tôi truy cập vào UIViewController
và UINavigationController
phía sau chế độ xem. UIKit's
MVC đã 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 SwiftUI
như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 UIKit
như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ọ!