मैं एक लॉगआउट बटन विकसित करना चाहता हूं जो मुझे लॉग इन रूट पर भेज देगा और अन्य सभी मार्गों को हटा देगा Navigator
। दस्तावेज़ीकरण यह समझाता नहीं है RoutePredicate
कि किसी प्रकार का रिमूवल कैसे बनाया जा सकता है या किसी भी प्रकार का है।
मैं एक लॉगआउट बटन विकसित करना चाहता हूं जो मुझे लॉग इन रूट पर भेज देगा और अन्य सभी मार्गों को हटा देगा Navigator
। दस्तावेज़ीकरण यह समझाता नहीं है RoutePredicate
कि किसी प्रकार का रिमूवल कैसे बनाया जा सकता है या किसी भी प्रकार का है।
जवाबों:
मैं निम्नलिखित कोड के साथ इसे पूरा करने में सक्षम था:
Navigator.of(context)
.pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
यहां का रहस्य एक रूटप्रेडिकेट का उपयोग कर रहा है जो हमेशा गलत रिटर्न देता है (Route<dynamic> route) => false
। इस स्थिति में यह /login
मेरे द्वारा धक्का दिए गए नए मार्ग को छोड़कर सभी मार्गों को हटा देता है ।
मैं निम्नलिखित कोड स्निपेट के साथ कर सकता हूं:
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
LoginScreen()), (Route<dynamic> route) => false),
यदि आप धकेल दिए गए मार्ग के नीचे के सभी मार्ग को हटाना चाहते हैं, तो रूटप्रीडिट हमेशा झूठे , जैसे (मार्ग मार्ग) => असत्य को लौटाता है ।
एक और उपाय उपयोग करना है pushAndRemoveUntil()
। अन्य सभी मार्गों का उपयोग करने के लिएModalRoute.withName('/')
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (BuildContext context) => Login()),
ModalRoute.withName('/')
);
संदर्भ: https://api.flutter.dev/flutter/widgets/NavigatorState/pushAndRemoveUntil.html
यदि आप किसी विशेष स्क्रीन पर वापस जाना चाहते हैं और आप राउटर का उपयोग नहीं करते हैं तो अगले दृष्टिकोण का उपयोग कर सकते हैं
उदाहरण:
Navigator.pushAndRemoveUntil(context,
MaterialPageRoute(builder: (BuildContext context) => SingleShowPage()),
(Route<dynamic> route) => route is HomePage
);
मार्ग के साथ HomePage आप अपने विजेट का नाम जाँचते हैं।
यदि आप nameRoutes का उपयोग कर रहे हैं, तो आप इसे बस कर सकते हैं:
Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);
जहां "/ लॉगिन" वह मार्ग है जिसे आप रूट स्टैक पर पुश करना चाहते हैं।
ध्यान दें कि :
यह कथन स्टैक के सभी मार्गों को हटा देता है और धक्का दिए गए रूट को बनाता है।
मुझे नहीं पता कि क्यों किसी ने शेड्यूलर बाइंडिंग इंस्टेंस का उपयोग करके समाधान का उल्लेख नहीं किया है , हालांकि पार्टी के लिए थोड़ी देर हो गई है, मुझे लगता है कि यह मूल रूप से इसका जवाब देने का सही तरीका होगा ।
SchedulerBinding.instance.addPostFrameCallback((_) async {
Navigator.of(context).pushNamedAndRemoveUntil(
'/login',
(Route<dynamic> route) => false);
});
उपरोक्त कोड '' / लॉगिन '' के लिए सभी मार्गों और नौगट को हटा देता है, इससे यह भी सुनिश्चित हो जाता है कि कॉलबैक शेड्यूल करके नए मार्ग पर नेविगेट करने से पहले सभी फ़्रेमों को रेंडर किया गया है
यह मेरे लिए काम कर रहा है। वास्तव में, मैं ब्लॉक के साथ काम कर रहा था, लेकिन मेरा मुद्दा लॉगिन स्क्रीन ब्लॉक था। लॉगआउट के बाद यह अपडेट नहीं हो रहा था। यह पिछले मॉडल डेटा को धारण कर रहा था। यहां तक कि, मैंने गलत प्रविष्टि दर्ज की यह होम स्क्रीन पर जा रहा था।
चरण 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());
}
यकीन नहीं होता अगर मैं यह सही कर रहा हूँ
लेकिन यह रूट विजेट द्वारा पॉपिंग के मेरे उपयोग के मामले को सूट करता है
void popUntilRoot({Object result}) {
if (Navigator.of(context).canPop()) {
pop();
popUntilRoot();
}
}