Saya mencoba melakukan arsitektur untuk aplikasi SwiftUI yang lebih besar dan siap produksi. Saya menjalankan semua waktu ke masalah yang sama yang menunjuk ke cacat desain utama di SwiftUI.
Masih tidak ada yang bisa memberi saya jawaban yang berfungsi penuh, siap produksi.
Bagaimana cara melakukan Tampilan yang dapat digunakan kembali SwiftUI
yang mengandung navigasi?
Karena SwiftUI
NavigationLink
sangat terikat pada tampilan ini tidak mungkin sedemikian rupa sehingga skala juga dalam Aplikasi yang lebih besar. NavigationLink
dalam contoh kecil Aplikasi itu berfungsi, ya - tetapi tidak segera setelah Anda ingin menggunakan kembali banyak Tampilan dalam satu Aplikasi. Dan mungkin juga menggunakan kembali batas-batas modul. (seperti: menggunakan kembali Tampilan di iOS, WatchOS, dll ...)
Masalah desain: NavigationLinks di-hardcode ke dalam View.
NavigationLink(destination: MyCustomView(item: item))
Tetapi jika tampilan yang mengandung ini NavigationLink
harus dapat digunakan kembali saya tidak dapat membuat hardcode tujuan. Harus ada mekanisme yang menyediakan tujuan. Saya bertanya di sini dan mendapat jawaban yang cukup baik, tetapi masih belum jawaban lengkap:
SwiftUI MVVM Coordinator / Router / NavigationLink
Idenya adalah untuk menyuntikkan Tautan Tujuan ke tampilan yang dapat digunakan kembali. Secara umum ide ini bekerja tetapi sayangnya ini tidak skala ke Aplikasi Produksi nyata. Segera setelah saya memiliki beberapa layar yang dapat digunakan kembali, saya mengalami masalah logis bahwa satu tampilan yang dapat digunakan kembali ( ViewA
) membutuhkan tampilan-tujuan yang telah dikonfigurasikan sebelumnya ( ViewB
). Tetapi bagaimana jika ViewB
juga membutuhkan view-destination yang telah dikonfigurasi sebelumnya ViewC
? Saya akan perlu membuat ViewB
sudah sedemikian rupa sehingga ViewC
disuntikkan sudah di ViewB
sebelum saya menyuntikkan ViewB
ke dalam ViewA
. Dan seterusnya .... tetapi karena data yang pada saat itu harus dilewati tidak tersedia, keseluruhan konstruksinya gagal.
Gagasan lain yang saya miliki adalah menggunakan Environment
mekanisme injeksi ketergantungan untuk menyuntikkan tujuan NavigationLink
. Tapi saya pikir ini harus dianggap kurang lebih sebagai peretasan dan bukan solusi yang dapat diskalakan untuk Aplikasi besar. Kami pada akhirnya akan menggunakan Lingkungan pada dasarnya untuk semuanya. Tetapi karena Lingkungan juga dapat digunakan hanya di dalam View (tidak di Koordinator atau ViewModels terpisah) ini lagi akan membuat konstruksi aneh menurut saya.
Seperti logika bisnis (misalnya kode model tampilan) dan tampilan harus dipisahkan juga navigasi dan tampilan harus dipisahkan (misalnya pola Koordinator) Di UIKit
dalamnya dimungkinkan karena kami mengakses ke UIViewController
dan di UINavigationController
belakang tampilan. UIKit's
MVC sudah memiliki masalah yang membuat begitu banyak konsep sehingga menjadi nama yang menyenangkan "Massive-View-Controller" bukannya "Model-View-Controller". Sekarang masalah yang sama terus berlanjut SwiftUI
tetapi bahkan lebih buruk lagi menurut saya. Navigasi dan Tampilan sangat digabungkan dan tidak dapat dipisahkan. Karenanya tidak mungkin untuk melakukan tampilan yang dapat digunakan kembali jika mengandung navigasi. Itu mungkin untuk menyelesaikan ini, UIKit
tetapi sekarang saya tidak dapat melihat solusi yang masuk akalSwiftUI
. Sayangnya Apple tidak memberikan penjelasan kepada kami bagaimana menyelesaikan masalah arsitektur seperti itu. Kami hanya mendapat beberapa Aplikasi sampel kecil.
Saya ingin terbukti salah. Tolong tunjukkan saya pola desain App bersih yang memecahkan ini untuk Aplikasi siap produksi besar.
Terima kasih sebelumnya.
Pembaruan: karunia ini akan berakhir dalam beberapa menit dan sayangnya masih tidak ada yang bisa memberikan contoh yang berfungsi. Tetapi saya akan memulai karunia baru untuk menyelesaikan masalah ini jika saya tidak dapat menemukan solusi lain dan menautkannya di sini. Terima kasih untuk semua untuk Kontribusi mereka yang luar biasa!