डिफर्ड नेविगेशन (Deferred Navigation) विलंबित नेविगेशन का एक पैटर्न है जिसमें अगली स्क्रीन पर संक्रमण एक एसिंक्रोनस ऑपरेशन पूरा होने के बाद होता है, न कि सीधे उपयोगकर्ता की कार्रवाई के क्षण में। Android Developers (2024) के अनुसार, डिफर्ड नेविगेशन नेविगेशन और डेटा लोडिंग के बीच रेस कंडीशन से बचने में मदद करता है, और पुश नोटिफिकेशन और डीपलिंक से संक्रमण को संभालना सरल बनाता है। मुख्य अंतर — रूट की गणना सभी आवश्यक डेटा उपलब्ध होने के बाद की जाती है।
मुख्य बिंदु
डिफर्ड नेविगेशन (Deferred Navigation) एक आर्किटेक्चरल पैटर्न है जिसमें नेविगेशन निर्णय तब तक स्थगित किया जाता है जब तक सभी आवश्यक डेटा उपलब्ध न हो जाए। प्रत्यक्ष संक्रमण के विपरीत जहां उपयोगकर्ता एक बटन दबाता है और तुरंत एक नई स्क्रीन पर पहुँच जाता है, डिफर्ड नेविगेशन ट्रिगर घटना और वास्तविक संक्रमण को अलग करता है, उनके बीच एक एसिंक्रोनस ऑपरेशन रखता है।
आर्किटेक्चरल रूप से, डिफर्ड नेविगेशन स्थिति परिवर्तन पर बनाया गया है: बटन दबाने से एक एसिंक्रोनस प्रक्रिया शुरू होती है, और उसके परिणाम की सदस्यता नेविगेशन को ट्रिगर करती है। यह MVVM या MVI आर्किटेक्चर वाले एप्लिकेशन में विशेष रूप से महत्वपूर्ण है, जहां ViewModel स्थिति का प्रबंधन करता है और View (Activity, Fragment, SwiftUI View) परिवर्तनों की सदस्यता लेता है और संक्रमण के साथ प्रतिक्रिया करता है। यह दृष्टिकोण UI और नेविगेशन तर्क के बीच सीधे निर्भरता को समाप्त करता है।
Google I/O 2023 के अनुसार, डिफर्ड नेविगेशन सभी परिदृश्यों के लिए अनुशंसित है जहां नेविगेशन नेटवर्क अनुरोध, प्रमाणीकरण जांच, कॉन्फ़िगरेशन लोडिंग या अनुमतियों के परिणाम पर निर्भर करता है। डीपलिंक को संभालते समय भी पैटर्न अनिवार्य है, जहां एप्लिकेशन को पहले लॉन्च होना चाहिए, रूट स्क्रीन लोड करनी चाहिए और उसके बाद ही लक्ष्य रूट पर नेविगेट करना चाहिए।
डिफर्ड नेविगेशन उन परिदृश्यों में उपयोग किया जाता है जहां प्रत्यक्ष नेविगेशन गलत स्क्रीन स्थिति या लोडिंग त्रुटियों की ओर ले जाता है। आइए चार मुख्य मामलों की जाँच करें जहां डिफर्ड नेविगेशन आवश्यक है।
यदि उपयोगकर्ता संरक्षित सामग्री पर टैप करता है, तो एप्लिकेशन को पहले एक्सेस टोकन की जाँच करनी चाहिए। प्रत्यक्ष नेविगेशन सामग्री स्क्रीन पर खाली स्क्रीन या 401 त्रुटि देगा यदि टोकन समाप्त हो गया है। डिफर्ड नेविगेशन टोकन की जाँच करता है, और केवल सफलता पर — लक्ष्य स्क्रीन पर नेविगेट करता है। विफलता पर — लॉगिन स्क्रीन पर रीडायरेक्ट करता है।
जब कोई एप्लिकेशन बाहरी लिंक के माध्यम से खोला जाता है, तो पहले रूट स्क्रीन लोड करनी होती है, नेविगेशन स्थिति को पुनर्स्थापित करना होता है और उसके बाद ही डीपलिंक संक्रमण करना होता है। रूट संदर्भ के बिना लक्ष्य स्क्रीन पर प्रत्यक्ष नेविगेशन असामान्यताओं का कारण बनेगा: खाली नेविगेशन स्टैक या टूटा हुआ बैक स्टैक।
पुश नोटिफिकेशन पर टैप करते समय, एप्लिकेशन तीन स्थितियों में से एक में हो सकता है: बंद, बैकग्राउंड में या सक्रिय। डिफर्ड नेविगेशन एप्लिकेशन की स्थिति निर्धारित करता है, आवश्यक सामग्री लोड करता है और उसके बाद ही लक्ष्य स्क्रीन दिखाता है। iOS UNNotificationContentExtension के माध्यम से इस परिदृश्य को संभालने की अनुमति देता है।
यदि स्क्रीन की कार्यक्षमता सर्वर से फीचर फ्लैग द्वारा नियंत्रित होती है, तो डिफर्ड नेविगेशन पहले कॉन्फ़िगरेशन का अनुरोध करने और उसके बाद ही स्क्रीन दिखाने की अनुमति देता है। यदि सुविधा अक्षम है — उपयोगकर्ता खाली स्क्रीन के बजाय वैकल्पिक सामग्री या प्लेसहोल्डर देखता है।
| परिदृश्य | प्रत्यक्ष नेविगेशन | डिफर्ड नेविगेशन |
|---|---|---|
| प्राधिकरण | समाप्त टोकन के साथ खाली स्क्रीन | लॉगिन पर रीडायरेक्ट |
| डीपलिंक | टूटा हुआ बैक स्टैक | सही नेविगेशन स्टैक |
| पुश | संदर्भ के बिना लोडिंग | संक्रमण से पहले डेटा तैयार |
| फीचर फ्लैग | अनुपलब्ध कार्यक्षमता दिखाना | प्लेसहोल्डर या विकल्प |
प्रत्यक्ष नेविगेशन एक पारंपरिक दृष्टिकोण है जहां संक्रमण किसी घटना के जवाब में तुरंत किया जाता है। उपयोगकर्ता एक बटन दबाता है, और UI राउटर तुरंत स्क्रीन बदल देता है। यह दृष्टिकोण सरल और पूर्वानुमेय है लेकिन उन परिदृश्यों में सीमित है जहां सर्वर से डेटा या शर्तों की जाँच की आवश्यकता होती है।
डिफर्ड नेविगेशन एसिंक्रोनस स्थिति के रूप में एक परत जोड़ता है। उपयोगकर्ता घटना एक ऑपरेशन शुरू करती है, और परिणाम की सदस्यता नेविगेशन को नियंत्रित करती है। यह कोड जटिलता बढ़ाता है लेकिन लचीलापन प्रदान करता है: एक ही ट्रिगर लोड किए गए डेटा के आधार पर अलग-अलग स्क्रीन पर ले जा सकता है।
दो दृष्टिकोणों के बीच चुनाव आवश्यकताओं पर निर्भर करता है: यदि स्क्रीन प्रदर्शित करने के लिए एसिंक्रोनस डेटा की आवश्यकता नहीं है — प्रत्यक्ष नेविगेशन का उपयोग करें। यदि स्क्रीन अनुरोध, प्राधिकरण या बाहरी शर्तों के परिणाम पर निर्भर करती है — डिफर्ड नेविगेशन आवश्यक है। एक हाइब्रिड दृष्टिकोण, जहां कुछ संक्रमण प्रत्यक्ष हैं और कुछ विलंबित हैं, औद्योगिक एप्लिकेशन में सबसे आम अभ्यास है।
Android Jetpack आर्किटेक्चर स्तर पर डिफर्ड नेविगेशन को लागू करने के लिए तंत्र प्रदान करता है। मुख्य विचार — ViewModel स्थिति का प्रबंधन करता है, जबकि Activity या Fragment परिवर्तनों की सदस्यता लेता है और NavController के माध्यम से नेविगेशन ट्रिगर करता है।
StateFlow Kotlin कोरूटीन में डिफर्ड नेविगेशन के लिए आदर्श उपकरण है। ViewModel नेविगेशन घटना के साथ StateFlow को अपडेट करता है, और Activity इसे देखती है और संक्रमण करती है। जब घटना संसाधित हो जाती है, StateFlow साफ़ हो जाता है, जिससे बार-बार नेविगेशन रुकता है।
class MainViewModel : ViewModel() {
private val _navigation = MutableSharedFlow<NavigationEvent>()
val navigation: SharedFlow<NavigationEvent> = _navigation
fun onDeepLinkReceived(link: String) {
viewModelScope.launch {
val data = resolveDeepLink(link)
_navigation.emit(NavigationEvent.GoToScreen(data))
}
}
}
Activity में, नेविगेशन की सदस्यता ViewModel से रूट के साथ NavController को ट्रिगर करती है। स्क्रीन रोटेशन पर बार-बार नेविगेशन को रोकने के लिए, NavigationEventWrapper रैपर का उपयोग किया जाता है जो घटना को केवल एक बार संसाधित करता है। Jetpack Navigation 2.7+ टाइप-सुरक्षित तर्क पासिंग के लिए Safe Args का समर्थन करता है।
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: MainViewModel by viewModels()
repeatOnLifecycle(Lifecycle.State.STARTED) {
vm.navigation.collect { event ->
when (event) {
is NavigationEvent.GoToScreen ->
findNavController(R.id.nav_host)
.navigate(event.route)
}
}
}
}
}
iOS में Android Jetpack के समान कोई अंतर्निहित Navigation Component नहीं है, इसलिए डेवलपर्स Combine या async/await के साथ Coordinator Pattern के माध्यम से डिफर्ड नेविगेशन लागू करते हैं। Coordinator स्क्रीन स्टैक का प्रबंधन करता है और लोड किए गए डेटा के आधार पर नेविगेशन निर्णय लेता है।
Coordinator एक ऑब्जेक्ट है जो ViewControllers के बीच नेविगेशन का प्रबंधन करता है। Combine के साथ, ViewModel PassthroughSubject के माध्यम से घटनाएँ प्रकाशित करता है, और Coordinator उनकी सदस्यता लेता है और संक्रमण करता है। यह दृष्टिकोण UI को नेविगेशन तर्क से पूरी तरह अलग करता है और एप्लिकेशन आर्किटेक्चर के लिए Apple की सिफारिशों का पालन करता है।
final class AppCoordinator {
private var cancellables = Set<AnyCancellable>()
func start(viewModel: MainViewModel) {
viewModel.$navigationDestination
.compactMap { $0 }
.sink { [weak self] destination in
self?.navigateTo(destination)
}
.store(in: &cancellables)
}
}
Swift 5.5 ने स्ट्रक्चर्ड कंकरेंसी पेश की, जो Combine के बिना async/await के माध्यम से डिफर्ड नेविगेशन लागू करने की अनुमति देती है। ViewModel एक async फ़ंक्शन प्रदान करता है जो डेटा लोड करने के बाद रूट लौटाता है। Coordinator इस फ़ंक्शन को Task में कॉल करता है और प्राप्त रूट के आधार पर संक्रमण करता है।
class AuthViewModel: ObservableObject {
func resolveDeeplink(_ url: URL) async -> AppRoute? {
guard let token = await AuthService.shared.getValidToken() else { return .login }
return await DeeplinkRouter.resolve(url, token: token)
}
}
// In Coordinator:
Task {
if let route = await viewModel.resolveDeeplink(url) {
navigateTo(route)
}
}
डिफर्ड नेविगेशन एसिंक्रोनस परिदृश्यों को संभालना सरल बनाता है लेकिन स्थिति प्रबंधन के लिए अनुशासित दृष्टिकोण की आवश्यकता होती है। आइए मुख्य गलतियों की जाँच करें जो डेवलपर्स डिफर्ड नेविगेशन लागू करते समय करते हैं।
सबसे आम गलती — रूट स्क्रीन के पूरी तरह इनिशियलाइज़ होने और NavController या Coordinator के संक्रमण के लिए तैयार होने से पहले डिफर्ड नेविगेशन करने का प्रयास। एंड्रॉइड में इससे IllegalStateException होता है, iOS में — अपरिभाषित UI स्थिति। समाधान — नेविगेशन ट्रिगर करने से पहले सुनिश्चित करें कि घटक का जीवनचक्र STARTED या RESUMED स्थिति में है।
यदि StateFlow या Subject प्रसंस्करण के बाद घटना को साफ़ नहीं करता है, तो पिछली स्क्रीन पर वापस आने पर उपयोगकर्ता स्वचालित रूप से उसी स्क्रीन पर पुनर्निर्देशित हो सकता है। एंड्रॉइड में replay=0 के साथ SharedFlow का उपयोग करें या iOS में प्रसंस्करण के बाद CurrentValueSubject को nil के साथ, ताकि नेविगेशन घटना केवल एक बार चले।
एप्लिकेशन में सभी नेविगेशन के लिए एक केंद्रीय घटक का उपयोग करें। जब प्रत्येक Activity, Fragment या ViewController का अपना नेविगेशन कंट्रोलर होता है, तो एप्लिकेशन के विभिन्न भागों के बीच डिफर्ड नेविगेशन अव्यवस्थित हो जाता है। एकल Coordinator नेविगेशन परिदृश्यों की डिबगिंग और परीक्षण को सरल बनाता है।
डिफर्ड नेविगेशन का परीक्षण प्रत्यक्ष नेविगेशन की तुलना में कठिन है क्योंकि एसिंक्रोनस ऑपरेशन समय कारक पेश करते हैं। एंड्रॉइड में TestDispatcher (kotlinx-coroutines-test) और iOS में XCTestExpectation का उपयोग करें डेटा लोडिंग का अनुकरण करने और यह सत्यापित करने के लिए कि नेविगेशन अपेक्षित रूट का पालन करता है। प्रत्येक परिदृश्य के पृथक परीक्षण के लिए प्राधिकरण और डीपलिंक सेवाओं को मॉक करें।
अक्सर पूछे जाने वाले प्रश्न
डिफर्ड नेविगेशन एक विलंबित संक्रमण पैटर्न है जिसे किसी भी एसिंक्रोनस परिदृश्य में लागू किया जा सकता है। डीप लिंक डिफर्ड नेविगेशन के लिए एक ट्रिगर है, लेकिन एकमात्र नहीं। प्रमाणीकरण और फीचर फ्लैग भी विलंबित नेविगेशन का उपयोग करते हैं।
हाँ, अधिकांश एप्लिकेशन हाइब्रिड दृष्टिकोण का उपयोग करते हैं। उत्पाद सूची स्क्रीन (बिना एसिंक्रोनस निर्भरता के) प्रत्यक्ष नेविगेशन का उपयोग कर सकती है, जबकि डेटा लोडिंग वाली विवरण स्क्रीन — डिफर्ड का। विभाजन प्रत्येक विशिष्ट स्क्रीन की आर्किटेक्चर द्वारा निर्धारित किया जाता है।
उपयोग करें एंड्रॉइड में बिना replay के SharedFlow और iOS में बिना बफ़रिंग के combineLatest। नए ट्रिगर पर पिछली सदस्यताएँ रद्द करें। यह सुनिश्चित करता है कि केवल नवीनतम नेविगेशन घटना संसाधित हो।
हाँ, Compose में डिफर्ड नेविगेशन ViewModel StateFlow की सदस्यता और LaunchedEffect में NavController.navigate कॉल के माध्यम से कार्यान्वित किया जाता है। Google विलंबित परिदृश्यों के लिए ईवेंट-संचालित मॉडल के साथ Navigation Compose का उपयोग करने की सिफारिश करता है।
विलंबित करें नेविगेशन जब तक एप्लिकेशन फिर से सक्रिय न हो जाए। एंड्रॉइड में ईवेंट फ़िल्टर करने के लिए Lifecycle.State.STARTED का उपयोग करें। iOS में Combine या async/await ब्लॉक में UIApplication.State की जाँच करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें