NavigationStack হল SwiftUI-তে একটি আধুনিক নেভিগেশন কন্টেইনার, যা iOS 16+-এ প্রবর্তিত হয়েছে এবং NavigationView-কে প্রতিস্থাপন করেছে। Apple Developer Documentation, 2024 অনুসারে, NavigationStack একটি টাইপ-নিরাপদ নেভিগেশন পাথ (NavigationPath) এর মাধ্যমে স্ক্রিনের স্ট্যাক পরিচালনা করে, ডিপ নেভিগেশন, রুট স্ক্রিনে প্রোগ্রাম্যাটিক রিটার্ন এবং ডেটা পরিবর্তনের সময় অবস্থা সংরক্ষণ সমর্থন করে। NavigationView-এর বিপরীতে, NavigationStack-এর একটি অতিরিক্ত কন্টেইনারে মোড়ানোর প্রয়োজন হয় না এবং নেভিগেশন পাথে সরাসরি Binding প্রদান করে।
মূল বিষয়
NavigationStack হল একটি কন্টেইনার View যা স্ট্যাক-ভিত্তিক নেভিগেশন (LIFO) বাস্তবায়ন করে। এটি ট্রানজিশন ইতিহাস পরিচালনা করে, আপনাকে স্ট্যাকের উপর নতুন স্ক্রিন পুশ করতে এবং সিস্টেমের "পেছনে" বোতাম বা প্রোগ্রাম্যাটিকভাবে ফিরে যেতে দেয়। NavigationStack iOS 16, iPadOS 16, macOS 13, watchOS 9 এবং tvOS 16 থেকে SwiftUI-এর অংশ।
NavigationStack-এর প্রধান উদ্ভাবন হল টাইপ-নিরাপদ নেভিগেশন পথ। NavigationLink তৈরি করার সময় সরাসরি গন্তব্য নির্দিষ্ট করার পরিবর্তে, আপনি পথে একটি মান রাখেন এবং গন্তব্য View আলাদাভাবে .navigationDestination(for:destination:) মডিফায়ারের মাধ্যমে নিবন্ধিত হয়। এটি নেভিগেশনকে রেন্ডারিং থেকে আলাদা করে, কোডকে আরও মডুলার এবং পরীক্ষাযোগ্য করে তোলে।
WWDC 2022 (সেশন 10054) অনুসারে, NavigationStack ObservableObject এবং SwiftUI লাইফসাইকের উপর ভিত্তি করে একটি নতুন নেভিগেশন মেকানিজম ব্যবহার করে। NavigationView-এর বিপরীতে, যা অভ্যন্তরীণভাবে UINavigationController-এর উপর নির্ভরশীল ছিল, NavigationStack সম্পূর্ণরূপে SwiftUI-তে বাস্তবায়িত, যা SwiftUI লাইফসাইকের সাথে পূর্বাভাসযোগ্যতা এবং সামঞ্জস্য উন্নত করে।
NavigationStack একটি রুট View এবং একটি ঐচ্ছিক নেভিগেশন পাথ (NavigationPath বা Hashable মানের অ্যারেতে Binding) গ্রহণ করে। সমস্ত চাইল্ড স্ক্রিন NavigationLink-এর মাধ্যমে বা পথে প্রোগ্রাম্যাটিকভাবে মান যোগ করে স্ট্যাকের উপর পুশ করা হয়।
NavigationView ছিল iOS 16-এর আগে SwiftUI-তে প্রধান নেভিগেশন কন্টেইনার। এটি অভ্যন্তরীণভাবে স্বয়ংক্রিয়ভাবে UINavigationController পরিচালনা করত, যা বেশ কয়েকটি সমস্যার সৃষ্টি করেছিল: ডেটা পরিবর্তনের সময় অপ্রত্যাশিত আচরণ, প্রোগ্রাম্যাটিক নেভিগেশনে জটিলতা এবং টাইপ নিরাপত্তার অভাব।
| বৈশিষ্ট্য | NavigationStack (iOS 16+) | NavigationView (iOS 13-15) |
|---|---|---|
| নেভিগেশন টাইপ | স্ট্যাক (LIFO) | স্ট্যাক (LIFO) |
| নেভিগেশন পথ | টাইপ করা (NavigationPath) | সমর্থিত নয় |
| Deep linking | অন্তর্নির্মিত সমর্থন | হ্যাক প্রয়োজন |
| প্রোগ্রাম্যাটিক ফেরত | পথের মাধ্যমে (pop, popToRoot) | dismiss, presentationMode |
| অভ্যন্তরীণ | SwiftUI নেটিভ | UINavigationController |
| সামঞ্জস্য | iOS 16+ | iOS 13+ |
মূল সুবিধা NavigationStack-এর — টাইপ-নিরাপদ নেভিগেশন। আপনি পথটি নির্দিষ্ট টাইপের অ্যারে (বা ভিন্নধর্মী স্ট্যাকের জন্য NavigationPath) হিসাবে সংজ্ঞায়িত করেন এবং প্রতিটি টাইপের জন্য একটি গন্তব্য নিবন্ধন করেন। এটি টাইপ অমিল ত্রুটিগুলি দূর করে এবং নেভিগেশনকে পূর্বাভাসযোগ্য করে তোলে।
NavigationView iOS 17-তে অবচিত হয়েছে। Apple সমস্ত নতুন প্রকল্পের জন্য এবং ন্যূনতম সংস্করণ iOS 16-এ আপডেট করার সময় NavigationStack-এ মাইগ্রেট করার সুপারিশ করে।
NavigationPath হল একটি টাইপ যা NavigationStack-এ নেভিগেশন পথ উপস্থাপন করে। এটি ভিন্নধর্মী মান (AnyHashable) সংরক্ষণ করতে পারে বা অ্যারে [T: Hashable]-এর Binding-এর মাধ্যমে একটি নির্দিষ্ট টাইপের সাথে ব্যবহার করা যেতে পারে। NavigationPath অবস্থা সংরক্ষণের জন্য স্বয়ংক্রিয়ভাবে এনকোড এবং ডিকোড হয়।
struct ContentView: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
HomeView()
.navigationDestination(for: String.self) { value in
DetailView(id: value)
}
.navigationDestination(for: Int.self) { value in
NumberView(number: value)
}
}
}
func goToRoot() {
path.removeLast(path.count)
}
func pushDeepLink() {
path.append("detail_42")
}
}
ভিন্নধর্মী স্ট্যাক: NavigationPath-এ বিভিন্ন টাইপের মান থাকতে পারে যদি তারা Hashable প্রয়োগ করে। উদাহরণস্বরূপ, প্রথম স্ক্রিনটি একটি String (ID) গ্রহণ করতে পারে, দ্বিতীয়টি একটি Int (সংখ্যা), তৃতীয়টি একটি কাস্টম enum Route। প্রতিটি টাইপ প্রদর্শনের জন্য একটি পৃথক .navigationDestination নিবন্ধন করে।
Codable সমর্থন: NavigationPath Codable প্রয়োগ করে যদি পথের সমস্ত মানও Codable + Hashable হয়। এটি অ্যাপ পুনরায় চালু করার বা ব্যাকগ্রাউন্ডে যাওয়ার সময় নেভিগেশন অবস্থা সংরক্ষণ এবং পুনরুদ্ধার করার অনুমতি দেয়।
.navigationDestination(for:destination:) — একটি মডিফায়ার যা একটি নির্দিষ্ট ডেটা টাইপের জন্য গন্তব্য View নিবন্ধন করে। যখন NavigationLink এই টাইপের একটি মান পথে রাখে, SwiftUI স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট .navigationDestination খুঁজে পায় এবং স্ক্রিন তৈরি করে।
enum AppRoute: Hashable {
case profile(UserID)
case settings
case about
}
struct AppNavigation: View {
@State private var path = NavigationPath()
var body: some View {
NavigationStack(path: $path) {
HomeView()
.navigationDestination(for: AppRoute.self) { route in
switch route {
case .profile(let id):
ProfileView(userId: id)
case .settings:
SettingsView()
case .about:
AboutView()
}
}
}
}
}
// Navigate: path.append(AppRoute.profile("user_123"))
গুরুত্বপূর্ণ নিয়ম: .navigationDestination অবশ্যই একটি View-এ প্রয়োগ করতে হবে যা NavigationStack-এর ভিতরে রয়েছে, এবং NavigationLink পথে মান রাখার আগে। এটি সাধারণত রুট View বা সেকশন কন্টেইনারে যোগ করা হয়। যদি মানের টাইপের জন্য .navigationDestination পাওয়া না যায়, তাহলে ট্রানজিশন ঘটবে না।
SwiftUI Engineering (2023) অনুসারে, .navigationDestination পদানুক্রমের বিভিন্ন স্তরে নিবন্ধিত হতে পারে। SwiftUI নেভিগেশনের সময় নিকটতম মিলে যাওয়া গন্তব্য অনুসন্ধান করে। এটি অ্যাপ্লিকেশনের বিভিন্ন অংশে একটি টাইপের জন্য গন্তব্য ওভাররাইড করার অনুমতি দেয়।
প্যাটার্ন 1: enum Route-এর মাধ্যমে নেভিগেশন। অ্যাপ্লিকেশনের সমস্ত স্ক্রিনের জন্য সংযুক্ত মান সহ একটি enum সংজ্ঞায়িত করুন। রাউটিংয়ের জন্য AppRoute-এর জন্য একটি .navigationDestination এবং একটি switch ব্যবহার করুন। এটি অ্যাপ্লিকেশনের সমস্ত সম্ভাব্য ট্রানজিশনের জন্য একক সত্য উৎস প্রদান করে।
struct StoreView: View {
@State private var path: [ProductRoute] = []
var body: some View {
NavigationStack(path: $path) {
ProductGrid()
.navigationDestination(for: ProductRoute.self) { route in
switch route {
case .detail(let product):
ProductDetail(product: product)
case .reviews(let productId):
ReviewsView(productId: productId)
}
}
}
}
}
enum ProductRoute: Hashable {
case detail(Product)
case reviews(String)
}
প্যাটার্ন 2: প্রোগ্রাম্যাটিক নেভিগেশন এবং deep linking. NavigationStack প্রোগ্রাম্যাটিক স্ট্যাক ব্যবস্থাপনার অনুমতি দেয়: স্ক্রিন যোগ করা, সরানো এবং রুটে ফিরে আসা। পুশ নোটিফিকেশন, ডিপ লিংক এবং পুনরায় চালুর পরে নেভিগেশন পুনরুদ্ধারের জন্য এটি প্রয়োজনীয়।
প্যাটার্ন 3: NavigationPath-এর পরিবর্তে টাইপের অ্যারে। যদি সমস্ত স্ক্রিন একই টাইপ ব্যবহার করে (যেমন, String বা একটি কাস্টম enum), তাহলে [T]-এর Binding ব্যবহার করুন। এটি NavigationPath-এর তুলনায় শক্তিশালী টাইপিং এবং ভালো কর্মক্ষমতা প্রদান করে। NavigationPath বিভিন্ন স্ক্রিন টাইপের ভিন্নধর্মী স্ট্যাকের জন্য ন্যায়সঙ্গত।
Point-Free (2024) অনুসারে, enum Route-সহ NavigationStack হল SwiftUI অ্যাপ্লিকেশনে নেভিগেশন সংগঠিত করার পছন্দের উপায়। এটি সমস্ত সম্ভাব্য ট্রানজিশনকে স্পষ্ট, টাইপ-নিরাপদ এবং পরীক্ষাযোগ্য করে তোলে, যা ডজন ডজন স্ক্রিনযুক্ত বড় প্রকল্পের জন্য বিশেষভাবে গুরুত্বপূর্ণ।
সচরাচর জিজ্ঞাসিত প্রশ্ন
NavigationStack — একটি SwiftUI নেভিগেশন কন্টেইনার (iOS 16+) যা টাইপ-নিরাপদ পথের মাধ্যমে স্ক্রিনের স্ট্যাক পরিচালনা করে। এটি NavigationView-কে প্রতিস্থাপন করেছে, যা deep linking, প্রোগ্রাম্যাটিক নেভিগেশন এবং অবস্থা সংরক্ষণের জন্য সমর্থন প্রদান করে।
NavigationStack সরাসরি NavigationLink-কে গন্তব্যের সাথে বাঁধার পরিবর্তে একটি টাইপ-নিরাপদ পথ (NavigationPath) ব্যবহার করে। এটি প্রোগ্রাম্যাটিক নেভিগেশন, deep linking এবং অবস্থা সংরক্ষণের জন্য Codable সমর্থন করে। এটি UINavigationController-এর মাধ্যমে নয়, SwiftUI-তে কাজ করে।
NavigationPath একটি টাইপ যা স্ট্যাকের স্ক্রিনের ক্রম উপস্থাপন করে। আপনি path.append() বা মান সহ NavigationLink-এর মাধ্যমে পথে মান যোগ করেন। প্রতিটি টাইপ প্রদর্শনের জন্য .navigationDestination নিবন্ধন করে। NavigationPath Codable এবং স্বয়ংক্রিয় অবস্থা সংরক্ষণ সমর্থন করে।
প্রোগ্রাম্যাটিক পথ ব্যবস্থাপনার মাধ্যমে: URL প্রক্রিয়াকরণের পরে, সংশ্লিষ্ট রুট মান সহ path.append() কল করুন। NavigationStack স্বয়ংক্রিয়ভাবে লক্ষ্য স্ক্রিন প্রদর্শন করে। রুটে ফেরত — path.removeLast(path.count).
হ্যাঁ, যদি আপনার ন্যূনতম সংস্করণ iOS 16+ হয়। NavigationView iOS 17-তে অবচিত হয়েছে। মাইগ্রেশন টাইপ-নিরাপদ নেভিগেশন, deep linking সমর্থন এবং SwiftUI লাইফসাইকের সাথে আরও ভালো সামঞ্জস্য প্রদান করে। iOS 15 এবং তার নীচের প্রকল্পগুলির জন্য, আপাতত NavigationView ব্যবহার চালিয়ে যান।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন