Quiero desarrollar un botón de cierre de sesión que me enviará a la ruta de inicio de sesión y eliminará todas las demás rutas del archivo Navigator
. La documentación no parece explicar cómo hacer RoutePredicate
o tener algún tipo de función removeAll.
98
Puedo hacerlo con el siguiente fragmento de código:
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) => LoginScreen()), (Route<dynamic> route) => false),
si desea eliminar toda la ruta debajo de la ruta presionada, RoutePredicate siempre devuelve falso , por ejemplo, (Ruta de ruta) => falso .
fuente
Otra alternativa es
popUntil()
Navigator.of(context).popUntil(ModalRoute.withName('/root'));
Esto quitará todas las rutas hasta que regrese a la ruta nombrada.
fuente
Otra solución es utilizar
pushAndRemoveUnit()
. Para eliminar todas las demás rutas, utiliceModalRoute.withName('/')
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => Login()), ModalRoute.withName('/'));
Referencia: https://api.flutter.dev/flutter/widgets/NavigatorState/pushAndRemoveUntil.html
fuente
En caso de que desee volver a la pantalla en particular y no use el enrutador con nombre, puede usar el siguiente enfoque
Ejemplo:
Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => SingleShowPage()), (Route<dynamic> route) => route is HomePage );
Con route is HomePage verificas el nombre de tu widget.
fuente
Si está utilizando namedRoutes, puede hacer esto simplemente:
Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);
Donde "/ login" es la ruta que desea insertar en la pila de rutas.
Tenga en cuenta que :
fuente
No sé por qué nadie mencionó la solución usando SchedularBindingInstance.Sin embargo, un poco tarde para la fiesta, creo que esta sería la forma correcta de hacerlo originalmente respondida aquí
SchedulerBinding.instance.addPostFrameCallback((_) async { Navigator.of(context).pushNamedAndRemoveUntil( '/login', (Route<dynamic> route) => false); });
El código anterior elimina todas las rutas y navega a '/ login' esto también asegura que todos los marcos se rendericen antes de navegar a la nueva ruta programando una devolución de llamada
fuente
Esto es trabajo para mí. En realidad, estaba trabajando con bloc pero mi problema era bloc de pantalla de inicio de sesión. No se estaba actualizando después de cerrar la sesión. Tenía los datos del modelo anterior. Incluso, ingresé la entrada incorrecta. Iba a la pantalla de inicio.
Paso 1:
Navigator.of(context).pushNamedAndRemoveUntil( UIData.initialRoute, (Route<dynamic> route) => false);
dónde,
UIData.initialRoute = "/" or "/login"
Paso 2:
Está trabajando para actualizar la pantalla. Si está trabajando con Bloc, será muy útil.
dónde,
MyApp() is the root class.
Código de clase raíz (es decir, 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());
Aquí está Mi método de cierre de sesión ,
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()); }
fuente
No estoy seguro de si estoy haciendo esto bien
pero esto se adapta a mi caso de uso de hacer estallar hasta que el widget raíz
void popUntilRoot({Object result}) { if (Navigator.of(context).canPop()) { pop(); popUntilRoot(); } }
fuente
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); }
fuente