डिफर्ड नेविगेशन (Deferred Navigation) — यह क्या है, सिद्धांत और कार्यान्वयन

लेखक: IT Sectr प्रकाशित: 2026-06-10 पढ़ने का समय: 9 मिनट

डिफर्ड नेविगेशन (Deferred Navigation) विलंबित नेविगेशन का एक पैटर्न है जिसमें अगली स्क्रीन पर संक्रमण एक एसिंक्रोनस ऑपरेशन पूरा होने के बाद होता है, न कि सीधे उपयोगकर्ता की कार्रवाई के क्षण में। Android Developers (2024) के अनुसार, डिफर्ड नेविगेशन नेविगेशन और डेटा लोडिंग के बीच रेस कंडीशन से बचने में मदद करता है, और पुश नोटिफिकेशन और डीपलिंक से संक्रमण को संभालना सरल बनाता है। मुख्य अंतर — रूट की गणना सभी आवश्यक डेटा उपलब्ध होने के बाद की जाती है।

मुख्य बिंदु

  • डिफर्ड नेविगेशन — विलंबित नेविगेशन जहां संक्रमण एसिंक्रोनस ऑपरेशन पूरा होने के बाद होता है
  • प्रत्यक्ष नेविगेशन तुरंत संक्रमण को संभालता है, डिफर्ड डेटा की प्रतीक्षा करता है
  • सामान्य परिदृश्य: प्रमाणीकरण, डीपलिंक, पुश नोटिफिकेशन, कॉन्फ़िगरेशन लोडिंग
  • एंड्रॉइड में Navigation Component के माध्यम से कॉलबैक और StateFlow के साथ कार्यान्वित किया जाता है
  • iOS में Combine या async/await का उपयोग नेविगेशन कोऑर्डिनेटर के साथ किया जाता है

डिफर्ड नेविगेशन क्या है

डिफर्ड नेविगेशन (Deferred Navigation) एक आर्किटेक्चरल पैटर्न है जिसमें नेविगेशन निर्णय तब तक स्थगित किया जाता है जब तक सभी आवश्यक डेटा उपलब्ध न हो जाए। प्रत्यक्ष संक्रमण के विपरीत जहां उपयोगकर्ता एक बटन दबाता है और तुरंत एक नई स्क्रीन पर पहुँच जाता है, डिफर्ड नेविगेशन ट्रिगर घटना और वास्तविक संक्रमण को अलग करता है, उनके बीच एक एसिंक्रोनस ऑपरेशन रखता है।

आर्किटेक्चरल रूप से, डिफर्ड नेविगेशन स्थिति परिवर्तन पर बनाया गया है: बटन दबाने से एक एसिंक्रोनस प्रक्रिया शुरू होती है, और उसके परिणाम की सदस्यता नेविगेशन को ट्रिगर करती है। यह MVVM या MVI आर्किटेक्चर वाले एप्लिकेशन में विशेष रूप से महत्वपूर्ण है, जहां ViewModel स्थिति का प्रबंधन करता है और View (Activity, Fragment, SwiftUI View) परिवर्तनों की सदस्यता लेता है और संक्रमण के साथ प्रतिक्रिया करता है। यह दृष्टिकोण UI और नेविगेशन तर्क के बीच सीधे निर्भरता को समाप्त करता है।

Google I/O 2023 के अनुसार, डिफर्ड नेविगेशन सभी परिदृश्यों के लिए अनुशंसित है जहां नेविगेशन नेटवर्क अनुरोध, प्रमाणीकरण जांच, कॉन्फ़िगरेशन लोडिंग या अनुमतियों के परिणाम पर निर्भर करता है। डीपलिंक को संभालते समय भी पैटर्न अनिवार्य है, जहां एप्लिकेशन को पहले लॉन्च होना चाहिए, रूट स्क्रीन लोड करनी चाहिए और उसके बाद ही लक्ष्य रूट पर नेविगेट करना चाहिए।

विलंबित नेविगेशन की आवश्यकता कब होती है

डिफर्ड नेविगेशन उन परिदृश्यों में उपयोग किया जाता है जहां प्रत्यक्ष नेविगेशन गलत स्क्रीन स्थिति या लोडिंग त्रुटियों की ओर ले जाता है। आइए चार मुख्य मामलों की जाँच करें जहां डिफर्ड नेविगेशन आवश्यक है।

प्राधिकरण और प्रमाणीकरण

यदि उपयोगकर्ता संरक्षित सामग्री पर टैप करता है, तो एप्लिकेशन को पहले एक्सेस टोकन की जाँच करनी चाहिए। प्रत्यक्ष नेविगेशन सामग्री स्क्रीन पर खाली स्क्रीन या 401 त्रुटि देगा यदि टोकन समाप्त हो गया है। डिफर्ड नेविगेशन टोकन की जाँच करता है, और केवल सफलता पर — लक्ष्य स्क्रीन पर नेविगेट करता है। विफलता पर — लॉगिन स्क्रीन पर रीडायरेक्ट करता है।

डीपलिंक को संभालना

जब कोई एप्लिकेशन बाहरी लिंक के माध्यम से खोला जाता है, तो पहले रूट स्क्रीन लोड करनी होती है, नेविगेशन स्थिति को पुनर्स्थापित करना होता है और उसके बाद ही डीपलिंक संक्रमण करना होता है। रूट संदर्भ के बिना लक्ष्य स्क्रीन पर प्रत्यक्ष नेविगेशन असामान्यताओं का कारण बनेगा: खाली नेविगेशन स्टैक या टूटा हुआ बैक स्टैक।

सामग्री के साथ पुश नोटिफिकेशन

पुश नोटिफिकेशन पर टैप करते समय, एप्लिकेशन तीन स्थितियों में से एक में हो सकता है: बंद, बैकग्राउंड में या सक्रिय। डिफर्ड नेविगेशन एप्लिकेशन की स्थिति निर्धारित करता है, आवश्यक सामग्री लोड करता है और उसके बाद ही लक्ष्य स्क्रीन दिखाता है। iOS UNNotificationContentExtension के माध्यम से इस परिदृश्य को संभालने की अनुमति देता है।

डायनामिक फीचर फ्लैग

यदि स्क्रीन की कार्यक्षमता सर्वर से फीचर फ्लैग द्वारा नियंत्रित होती है, तो डिफर्ड नेविगेशन पहले कॉन्फ़िगरेशन का अनुरोध करने और उसके बाद ही स्क्रीन दिखाने की अनुमति देता है। यदि सुविधा अक्षम है — उपयोगकर्ता खाली स्क्रीन के बजाय वैकल्पिक सामग्री या प्लेसहोल्डर देखता है।

परिदृश्यप्रत्यक्ष नेविगेशनडिफर्ड नेविगेशन
प्राधिकरणसमाप्त टोकन के साथ खाली स्क्रीनलॉगिन पर रीडायरेक्ट
डीपलिंकटूटा हुआ बैक स्टैकसही नेविगेशन स्टैक
पुशसंदर्भ के बिना लोडिंगसंक्रमण से पहले डेटा तैयार
फीचर फ्लैगअनुपलब्ध कार्यक्षमता दिखानाप्लेसहोल्डर या विकल्प

डिफर्ड नेविगेशन बनाम प्रत्यक्ष नेविगेशन

प्रत्यक्ष नेविगेशन एक पारंपरिक दृष्टिकोण है जहां संक्रमण किसी घटना के जवाब में तुरंत किया जाता है। उपयोगकर्ता एक बटन दबाता है, और UI राउटर तुरंत स्क्रीन बदल देता है। यह दृष्टिकोण सरल और पूर्वानुमेय है लेकिन उन परिदृश्यों में सीमित है जहां सर्वर से डेटा या शर्तों की जाँच की आवश्यकता होती है।

डिफर्ड नेविगेशन एसिंक्रोनस स्थिति के रूप में एक परत जोड़ता है। उपयोगकर्ता घटना एक ऑपरेशन शुरू करती है, और परिणाम की सदस्यता नेविगेशन को नियंत्रित करती है। यह कोड जटिलता बढ़ाता है लेकिन लचीलापन प्रदान करता है: एक ही ट्रिगर लोड किए गए डेटा के आधार पर अलग-अलग स्क्रीन पर ले जा सकता है।

दो दृष्टिकोणों के बीच चुनाव आवश्यकताओं पर निर्भर करता है: यदि स्क्रीन प्रदर्शित करने के लिए एसिंक्रोनस डेटा की आवश्यकता नहीं है — प्रत्यक्ष नेविगेशन का उपयोग करें। यदि स्क्रीन अनुरोध, प्राधिकरण या बाहरी शर्तों के परिणाम पर निर्भर करती है — डिफर्ड नेविगेशन आवश्यक है। एक हाइब्रिड दृष्टिकोण, जहां कुछ संक्रमण प्रत्यक्ष हैं और कुछ विलंबित हैं, औद्योगिक एप्लिकेशन में सबसे आम अभ्यास है।

एंड्रॉइड में कार्यान्वयन: Navigation Component और ViewModel

Android Jetpack आर्किटेक्चर स्तर पर डिफर्ड नेविगेशन को लागू करने के लिए तंत्र प्रदान करता है। मुख्य विचार — ViewModel स्थिति का प्रबंधन करता है, जबकि Activity या Fragment परिवर्तनों की सदस्यता लेता है और NavController के माध्यम से नेविगेशन ट्रिगर करता है।

StateFlow के साथ डिफर्ड नेविगेशन

StateFlow Kotlin कोरूटीन में डिफर्ड नेविगेशन के लिए आदर्श उपकरण है। ViewModel नेविगेशन घटना के साथ StateFlow को अपडेट करता है, और Activity इसे देखती है और संक्रमण करती है। जब घटना संसाधित हो जाती है, StateFlow साफ़ हो जाता है, जिससे बार-बार नेविगेशन रुकता है।

kotlin
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))
        }
    }
}

NavController के साथ डिफर्ड नेविगेशन

Activity में, नेविगेशन की सदस्यता ViewModel से रूट के साथ NavController को ट्रिगर करती है। स्क्रीन रोटेशन पर बार-बार नेविगेशन को रोकने के लिए, NavigationEventWrapper रैपर का उपयोग किया जाता है जो घटना को केवल एक बार संसाधित करता है। Jetpack Navigation 2.7+ टाइप-सुरक्षित तर्क पासिंग के लिए Safe Args का समर्थन करता है।

kotlin
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 में कार्यान्वयन: Coordinator Pattern और Combine

iOS में Android Jetpack के समान कोई अंतर्निहित Navigation Component नहीं है, इसलिए डेवलपर्स Combine या async/await के साथ Coordinator Pattern के माध्यम से डिफर्ड नेविगेशन लागू करते हैं। Coordinator स्क्रीन स्टैक का प्रबंधन करता है और लोड किए गए डेटा के आधार पर नेविगेशन निर्णय लेता है।

Combine के साथ Coordinator

Coordinator एक ऑब्जेक्ट है जो ViewControllers के बीच नेविगेशन का प्रबंधन करता है। Combine के साथ, ViewModel PassthroughSubject के माध्यम से घटनाएँ प्रकाशित करता है, और Coordinator उनकी सदस्यता लेता है और संक्रमण करता है। यह दृष्टिकोण UI को नेविगेशन तर्क से पूरी तरह अलग करता है और एप्लिकेशन आर्किटेक्चर के लिए Apple की सिफारिशों का पालन करता है।

swift
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)
    }
}

async/await के साथ डिफर्ड नेविगेशन

Swift 5.5 ने स्ट्रक्चर्ड कंकरेंसी पेश की, जो Combine के बिना async/await के माध्यम से डिफर्ड नेविगेशन लागू करने की अनुमति देती है। ViewModel एक async फ़ंक्शन प्रदान करता है जो डेटा लोड करने के बाद रूट लौटाता है। Coordinator इस फ़ंक्शन को Task में कॉल करता है और प्राप्त रूट के आधार पर संक्रमण करता है।

swift
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 के साथ, ताकि नेविगेशन घटना केवल एक बार चले।

सर्वोत्तम अभ्यास: एकल NavController या Coordinator

एप्लिकेशन में सभी नेविगेशन के लिए एक केंद्रीय घटक का उपयोग करें। जब प्रत्येक Activity, Fragment या ViewController का अपना नेविगेशन कंट्रोलर होता है, तो एप्लिकेशन के विभिन्न भागों के बीच डिफर्ड नेविगेशन अव्यवस्थित हो जाता है। एकल Coordinator नेविगेशन परिदृश्यों की डिबगिंग और परीक्षण को सरल बनाता है।

सर्वोत्तम अभ्यास: विलंबित नेविगेशन परिदृश्यों का परीक्षण

डिफर्ड नेविगेशन का परीक्षण प्रत्यक्ष नेविगेशन की तुलना में कठिन है क्योंकि एसिंक्रोनस ऑपरेशन समय कारक पेश करते हैं। एंड्रॉइड में TestDispatcher (kotlinx-coroutines-test) और iOS में XCTestExpectation का उपयोग करें डेटा लोडिंग का अनुकरण करने और यह सत्यापित करने के लिए कि नेविगेशन अपेक्षित रूट का पालन करता है। प्रत्येक परिदृश्य के पृथक परीक्षण के लिए प्राधिकरण और डीपलिंक सेवाओं को मॉक करें।

अक्सर पूछे जाने वाले प्रश्न

डिफर्ड नेविगेशन डीप लिंक से कैसे अलग है?

डिफर्ड नेविगेशन एक विलंबित संक्रमण पैटर्न है जिसे किसी भी एसिंक्रोनस परिदृश्य में लागू किया जा सकता है। डीप लिंक डिफर्ड नेविगेशन के लिए एक ट्रिगर है, लेकिन एकमात्र नहीं। प्रमाणीकरण और फीचर फ्लैग भी विलंबित नेविगेशन का उपयोग करते हैं।

क्या डिफर्ड और प्रत्यक्ष नेविगेशन को जोड़ा जा सकता है?

हाँ, अधिकांश एप्लिकेशन हाइब्रिड दृष्टिकोण का उपयोग करते हैं। उत्पाद सूची स्क्रीन (बिना एसिंक्रोनस निर्भरता के) प्रत्यक्ष नेविगेशन का उपयोग कर सकती है, जबकि डेटा लोडिंग वाली विवरण स्क्रीन — डिफर्ड का। विभाजन प्रत्येक विशिष्ट स्क्रीन की आर्किटेक्चर द्वारा निर्धारित किया जाता है।

डिफर्ड नेविगेशन में रेस कंडीशन से कैसे बचें?

उपयोग करें एंड्रॉइड में बिना replay के SharedFlow और iOS में बिना बफ़रिंग के combineLatest। नए ट्रिगर पर पिछली सदस्यताएँ रद्द करें। यह सुनिश्चित करता है कि केवल नवीनतम नेविगेशन घटना संसाधित हो।

क्या Jetpack Compose डिफर्ड नेविगेशन का समर्थन करता है?

हाँ, Compose में डिफर्ड नेविगेशन ViewModel StateFlow की सदस्यता और LaunchedEffect में NavController.navigate कॉल के माध्यम से कार्यान्वित किया जाता है। Google विलंबित परिदृश्यों के लिए ईवेंट-संचालित मॉडल के साथ Navigation Compose का उपयोग करने की सिफारिश करता है।

एप्लिकेशन के छोटा होने पर डिफर्ड नेविगेशन को कैसे संभालें?

विलंबित करें नेविगेशन जब तक एप्लिकेशन फिर से सक्रिय न हो जाए। एंड्रॉइड में ईवेंट फ़िल्टर करने के लिए Lifecycle.State.STARTED का उपयोग करें। iOS में Combine या async/await ब्लॉक में UIApplication.State की जाँच करें।

सारांश

  • डिफर्ड नेविगेशन — एक पैटर्न जहां संक्रमण एसिंक्रोनस ऑपरेशन पूरा होने के बाद होता है
  • मुख्य परिदृश्य: प्रमाणीकरण, डीपलिंक, पुश नोटिफिकेशन, फीचर फ्लैग
  • StateFlow/SharedFlow एंड्रॉइड में और Combine/async-await iOS में — कार्यान्वयन उपकरण
  • डिफर्ड नेविगेशन प्रत्यक्ष के विपरीत एसिंक्रोनस लोडिंग के दौरान रेस कंडीशन का कारण नहीं बनता
  • Navigation Component एंड्रॉइड में और Coordinator Pattern iOS में — मूल आर्किटेक्चर
  • एकल NavController/Coordinator सुसंगत नेविगेशन के लिए अनिवार्य है
  • परीक्षण डिफर्ड नेविगेशन के लिए TestDispatcher और एसिंक्रोनस सेवाओं के लिए मॉक आवश्यक है

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें