स्पंदन सभी मार्गों को हटाते हैं


107

मैं एक लॉगआउट बटन विकसित करना चाहता हूं जो मुझे लॉग इन रूट पर भेज देगा और अन्य सभी मार्गों को हटा देगा Navigator। दस्तावेज़ीकरण यह समझाता नहीं है RoutePredicateकि किसी प्रकार का रिमूवल कैसे बनाया जा सकता है या किसी भी प्रकार का है।

जवाबों:


277

मैं निम्नलिखित कोड के साथ इसे पूरा करने में सक्षम था:

Navigator.of(context)
    .pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);

यहां का रहस्य एक रूटप्रेडिकेट का उपयोग कर रहा है जो हमेशा गलत रिटर्न देता है (Route<dynamic> route) => false। इस स्थिति में यह /loginमेरे द्वारा धक्का दिए गए नए मार्ग को छोड़कर सभी मार्गों को हटा देता है ।


1
बहुत बहुत धन्यवाद यह सफलतापूर्वक काम किया। क्या आप कृपया कुछ लिंक भेज सकते हैं, जहाँ मैं अधिक समझ सकता हूँ ....
पवन

मुझे इससे समस्या हुई! IOS पर, एक देशी दृश्य को विजेट के रूप में उपयोग करने के बाद, अपनी पद्धति का उपयोग करने के बाद मूल दृश्य ठीक से विघटित नहीं होता है और इसका अस्तित्व बना रहता है, परिणामस्वरूप मेरे पास एक ऐसा दृश्य है जिसका उपयोग कभी भी पृष्ठभूमि की तरह नहीं किया जाएगा और डिस्पोज़ करना असंभव होगा । ऐसा सिर्फ iOS डिवाइस पर लगता है।
लोरेंजो इम्पीट्राइस

@LorenzoImperatrice क्या आपने इस समस्या के लिए ठीक पाया? मैं इसी तरह के मुद्दे पर चल रहा हूं
माटुज़ टिलमैन

3
मैं अभी भी इस का उपयोग करने के बाद भी खुला उदाहरण है। स्क्रीन को पुश करने और स्टैक के बाकी हिस्सों को हटाने के लिए कोई अन्य समाधान?
मनोज एमएम

हम इस दृष्टिकोण के साथ तर्क कैसे पारित कर सकते हैं।
Developine

84

मैं निम्नलिखित कोड स्निपेट के साथ कर सकता हूं:

 Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
    LoginScreen()), (Route<dynamic> route) => false),

यदि आप धकेल दिए गए मार्ग के नीचे के सभी मार्ग को हटाना चाहते हैं, तो रूटप्रीडिट हमेशा झूठे , जैसे (मार्ग मार्ग) => असत्य को लौटाता है


27

एक और विकल्प है popUntil()

Navigator.of(context).popUntil(ModalRoute.withName('/root'));

यह तब तक सभी मार्गों को बंद कर देगा जब तक आप नामित मार्ग पर वापस नहीं आ जाते।


1
मुझे यह उत्तर पसंद है!
noveleven


13

यदि आप किसी विशेष स्क्रीन पर वापस जाना चाहते हैं और आप राउटर का उपयोग नहीं करते हैं तो अगले दृष्टिकोण का उपयोग कर सकते हैं

उदाहरण:

Navigator.pushAndRemoveUntil(context,
                  MaterialPageRoute(builder: (BuildContext context) => SingleShowPage()),
                  (Route<dynamic> route) => route is HomePage
              );

मार्ग के साथ HomePage आप अपने विजेट का नाम जाँचते हैं।


NoAnimatedRoute क्या है? खिचड़ी भाषा इस तरह के नाम के साथ
Flutter

@kashlo ध्यान न दें =) यह सिर्फ मेरे कार्यान्वयन के बजाय MaterialPageRoute का उपयोग कर सकते हैं। लेकिन मैंने जवाब को संपादित किया है, धन्यवाद।
वलोडिमिर बिलोवस

(रूट <डायनेमिक> रूट) => मार्ग ।isFirst) अगर कुछ पहले रूट तक हटाना चाहते हैं।
हुसैन हैदर

7

यदि आप nameRoutes का उपयोग कर रहे हैं, तो आप इसे बस कर सकते हैं:

Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);

जहां "/ लॉगिन" वह मार्ग है जिसे आप रूट स्टैक पर पुश करना चाहते हैं।

ध्यान दें कि :

यह कथन स्टैक के सभी मार्गों को हटा देता है और धक्का दिए गए रूट को बनाता है।


5

मुझे नहीं पता कि क्यों किसी ने शेड्यूलर बाइंडिंग इंस्टेंस का उपयोग करके समाधान का उल्लेख नहीं किया है , हालांकि पार्टी के लिए थोड़ी देर हो गई है, मुझे लगता है कि यह मूल रूप से इसका जवाब देने का सही तरीका होगा

    SchedulerBinding.instance.addPostFrameCallback((_) async {
                              Navigator.of(context).pushNamedAndRemoveUntil(
                                  '/login',
                                  (Route<dynamic> route) => false);
                            });

उपरोक्त कोड '' / लॉगिन '' के लिए सभी मार्गों और नौगट को हटा देता है, इससे यह भी सुनिश्चित हो जाता है कि कॉलबैक शेड्यूल करके नए मार्ग पर नेविगेट करने से पहले सभी फ़्रेमों को रेंडर किया गया है


2

यह मेरे लिए काम कर रहा है। वास्तव में, मैं ब्लॉक के साथ काम कर रहा था, लेकिन मेरा मुद्दा लॉगिन स्क्रीन ब्लॉक था। लॉगआउट के बाद यह अपडेट नहीं हो रहा था। यह पिछले मॉडल डेटा को धारण कर रहा था। यहां तक ​​कि, मैंने गलत प्रविष्टि दर्ज की यह होम स्क्रीन पर जा रहा था।

चरण 1:

Navigator.of(context).pushNamedAndRemoveUntil(
        UIData.initialRoute, (Route<dynamic> route) => false);

कहाँ पे, UIData.initialRoute = "/" or "/login"

चरण 2:

यह स्क्रीन को रिफ्रेश करने के लिए काम कर रहा है। अगर आप ब्लॉक के साथ काम कर रहे हैं तो यह बहुत मददगार होगा।

runApp(MyApp());

कहाँ पे, MyApp() is the root class.

रूट क्लास (यानी MyApp) कोड

class MyApp extends StatelessWidget {

  final materialApp = Provider(
      child: MaterialApp(
          title: UIData.appName,
          theme: ThemeData(accentColor: UIColor().getAppbarColor(),
            fontFamily: UIData.quickFont,
          ),
          debugShowCheckedModeBanner: false,
          //home: SplashScreen(),
          initialRoute: UIData.initialRoute,
          routes: {
            UIData.initialRoute: (context) => SplashScreen(),
            UIData.loginRoute: (context) => LoginScreen(),
            UIData.homeRoute: (context) => HomeScreen(),
          },
          onUnknownRoute: (RouteSettings rs) => new MaterialPageRoute(
              builder: (context) => new NotFoundPage(
                appTitle: UIData.coming_soon,
                icon: FontAwesomeIcons.solidSmile,
                title: UIData.coming_soon,
                message: "Under Development",
                iconColor: Colors.green,
              )
          )));

  @override
  Widget build(BuildContext context) {
    return materialApp;
  }
}

void main() => runApp(MyApp());

यहाँ मेरा लॉगआउट तरीका है,

void logout() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    preferences.clear();

    // TODO: we can use UIData.loginRoute instead of UIData.initialRoute
    Navigator.of(context).pushNamedAndRemoveUntil(
        UIData.initialRoute, (Route<dynamic> route) => false);
    //TODO: It's working as refresh the screen
    runApp(MyApp());
  }

0

यकीन नहीं होता अगर मैं यह सही कर रहा हूँ

लेकिन यह रूट विजेट द्वारा पॉपिंग के मेरे उपयोग के मामले को सूट करता है

void popUntilRoot({Object result}) {
    if (Navigator.of(context).canPop()) {
      pop();
      popUntilRoot();
    }
}

0
to clear route - 

  onTap: () {
                    //todo to clear route -
                    Navigator.of(context).pop();
                    Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateEmployeeUpdateDateActivity(_token),));
                    widget.listener.onEmployeeDateClick(_day,_month, _year);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.