Gestion du retour avec le router API

Bonjour à tous !

Je rencontre un souci avec ma gestion du retour avec le router api de Flutter.
En effet, la bouton « retour » de l’AppBar() native fonctionne parfaitement, mais ce n’est pas le cas du bouton natif d’android (en bas d’écran). Lorsque celui-ci est activé, l’application se ferme complétement …
Je retrouve le souci dans l’application de Purple Giraffe également.
Je n’ai rien trouvé de miraculeux sur internet alors si vous avez déjà rencontré le cas et trouvé une solution, je suis preneur !! :smiley:

Merci d’avance,
Bonne journée

Mathis

C’est surement parce que tu fait un pushRemplacement() pour aller sur ta page. Dans ce cas tu supprimes ta page 1 pour la remplacer par ta page 2. Utilise un simple push() plutôt.

Edit : Si c’est pas le cas, montre nous comment tu fais qu’on puis mieux comprendre d’ou vient ton soucis :slight_smile:

Sinon une vidéo intéressante pour mettre en place un système de route (recommandé pour gérer ta navigation).

Merci @AntoLhn pour ta réponse.
Je n’utilise pas de pushRemplacement(), ni même de push() d’ailleurs. La vidéo que tu me conseilles ne semble donc pas correspondre à mon implémentation.
J’utilise le router api (navigation 2.0) avec la classe RouterDelegate.
Voici la classe en question :

class NavigationDelegate extends RouterDelegate<NavigationPath> with ChangeNotifier,
    PopNavigatorRouterDelegateMixin<NavigationPath>
    implements BottomNavBarRouter, HomeRouter, AppBarRouter
{

  bool _displayFavorites = false;
  Event? _eventDetails;
  User? _user;
  bool _displayProfil = false;


  @override
  Widget build(BuildContext context) {
    final List <Page<dynamic>> pagesList = [];
    final displayFavorites = _displayFavorites;
    final eventDetails = _eventDetails;
    final displayProfil = _displayProfil;
    final user = _user;
    final homeScreen = MyHomePage(this, HomeViewModel(this), this);
    pagesList.add(MaterialPage(child: homeScreen));
    if (displayProfil){
      if (user != null){
       //TODO : Page pour voir son profil
      }else{
        final loginScreen = LoginScreen(LoginViewModel(LoginService()));
        pagesList.add(MaterialPage(child: loginScreen));
      }
    }
    if (displayFavorites){
      final favoriteScreen = FavoriteScreen(this, HomeViewModel(this));
      pagesList.add(MaterialPage(child: favoriteScreen));
    }
    if (eventDetails != null){
      final eventDetail = EventDetailsScreen(eventDetails);
      pagesList.add(MaterialPage(child: eventDetail));
    }


    return Navigator(
      pages: pagesList,
      onPopPage: (route, result){
        if (route.didPop(result) == false){
          return false;
        }if(eventDetails != null){
          return onBackButtonTouchedDetailToPage();
        }else{
          return onBackButtonTouchedFavoriteToHome();
        }
      },
    );
  }

  bool onBackButtonTouchedDetailToPage(){
    if (_eventDetails != null){
      _eventDetails = null;
      notifyListeners();
    }
    return true;
  }

  bool onBackButtonTouchedFavoriteToHome(){
    if (_displayFavorites){
       _displayFavorites = false;
    }
    if (_eventDetails != null){
      _eventDetails = null;
    }if (_displayProfil){
      _displayProfil = false;
    }
    notifyListeners();
    return true;
  }

  @override
  NavigationPath? get currentConfiguration => NavigationPath(_displayFavorites, _eventDetails?.id);

  @override
  GlobalKey<NavigatorState>? navigatorKey = GlobalKey<NavigatorState>();

  @override
  Future<void> setNewRoutePath(NavigationPath configuration) async {
    final bool isDisplayFavoriteEnabled = configuration.displayFavorite;
    if (isDisplayFavoriteEnabled){
      _displayFavorites = true;
    }
  }

  @override
  displayFavorites() {
    _displayFavorites = true;
    notifyListeners();
  }

  @override
  displayHome() {
    _displayFavorites = false;
    notifyListeners();
  }

  @override
  DisplayDetail(Event event) {
    _eventDetails = event;
    notifyListeners();
  }

  @override
  displayProfil() {
    _displayProfil = true;
    notifyListeners();
  }
}

Merci d’avance,
Mathis

Ah oui ok, je vois l’idée. Je saisie ta méthode mais j’avoue ne pas avoir les connaissances nécessaires pour solutionner ton problème là…

Je passe mon tour :joy:

J’espère que quelqu’un sera t’aider.

Pas de souci ! Merci quand même et bonne soirée !

Salut @Mathis, tu as tout a fait raison j’ai bien le même problème sur l’app de Purple Giraffe :thinking:
Je vais essayer de comprendre d’où ça vient et je posterai ici la solution qui te servira aussi sur ton app

Salut @mbritto ,
Merci pour ton retour ! Je continue également de chercher de mon côté et posterais la solution, si je la trouve :smiley:
Bonne journée

1 « J'aime »

C’est bon j’ai trouvé !
En fait lorsque l’on crée le Navigator il faut l’associer à la clé que nous avons préparé au tout début, sinon lorsque l’évènement arrive, il ne retrouve pas le Navigator et ne peut pas appeler la fonction onPopPage.

Il te suffit d’ajouter la ligne : key: navigatorKey, dans le constructeur de ton Navigator en bas de la fonction build() ; comme ceci :

return Navigator(
      key: navigatorKey,
      pages: pagesList,
      onPopPage: (route, result) {
        if (route.didPop(result) == false) {
          return false;
        }
        return onBackButtonTouched(result);
      },
    );

C’était un joli bug, merci de l’avoir trouvé @Mathis !
Je vais mettre à jour l’app Android de Purple Giraffe et probablement mettre à jour le cours pour intégrer cette notion :+1:

1 « J'aime »

Super ! Merci pour la solution !
Bonne fin de journée

1 « J'aime »

Hello,
Je n’avais même pas remarqué que j’avais ce bug !!
C’est corrigé. Merci beaucoup !