web-dev-qa-db-fra.com

fermer l'application sur le bouton de retour de l'appareil en flottement

La question est peut-être en double mais je ne parviens pas à trouver la solution. Mon scénario d'application est le même que celui de la quasi-application. Mon premier écran est l'écran Splash et tient pendant deux secondes et ici la session de connexion est vérifiée et à cette condition, l'écran change comme ceci et le code ci-dessous est exécuté dans initState()

 _checkPreference() async {
    PreferencesConnector myprefs= PreferencesConnector();
    id=await myprefs.readString('merchantid');
    if(id==null||id==''){
      Future.delayed(
          const Duration(seconds: 2),
              () => Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => Login(),settings: RouteSettings(name: '/login')),
          ));

    }else{
      Future.delayed(
          const Duration(seconds: 2),
              () => Navigator.pushReplacement(
            context,
            MaterialPageRoute(builder: (context) => DashBoard()),
          ));

    }
  }

Si la session retourne false, elle passe à l'écran login, dans l'écran de connexion mon scaffold à l'intérieur du widget WillPopScope et cette classe est la classe stateful

  return WillPopScope(
        onWillPop: () {

         if (Navigator.canPop(context)) {
            //Navigator.pop(context);
            Navigator.of(context).pop();
          } else {
            SystemNavigator.pop();
          }
        },
        child:Scaffold(
        body: Stack(
          children: <Widget>[

et si LoginApi renvoie true, il passe à dashboard comme ceci

Navigator.pushReplacement(
                context,
                MaterialPageRoute(
                    builder: (context) => DashBoard(),
                    settings: RouteSettings(name: '/dashboard')),
              );

ici, tout fonctionne bien lorsque l'utilisateur est déjà connecté et nous atteignons le tableau de bord après le splash et mais il y a un bouton logOut sur mon tableau de bord lorsque l'utilisateur appuie sur logout puis il y a une boîte de dialogue apparaît qui demande la déconnexion - si j'appuie sur oui à partir du bouton de dialogue fonctionne comme ceci

onPressed:(){

    clearSession();
   // Navigator.of(context).popUntil(ModalRoute.());
   // Navigator.of(context).popUntil('/login', (Route<dynamic> route) => false);
   // Navigator.popUntil(context, ModalRoute.withName("/login"));
   // Navigator.of(context).pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);

      Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => Login()),);

},

après avoir appuyé sur la déconnexion, il atteint l'écran de connexion où je ne peux pas fermer l'application lorsque l'utilisateur appuie sur l'appareil depuis l'écran de connexion, mais il redirige vers le tableau de bord, puis j'ai appuyé sur puis sur l'application fermé.

enter image description here

5
Farhana

Ce que vous devez faire, c'est d'abord effacer tout le chemin avant d'aller à l'écran login().

essaye ça:

onPressed:(){
    clearSession();

      //Navigator.popUntil(context, ModalRoute.withName('/'));
      Navigator.pop(context,true);// It worked for me instead of above line
      Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => Login()),);

},
2
anmol.majhail

appelez cela sur votre bouton de déconnexion

  void _logout() {
      Navigator.popUntil(context, ModalRoute.withName('/login'));
    }

voici le lien officiel docs

0
End User