Router : pages précédentes toujours active

Bonjour,

En développant mon app web, je m’aperçois que la page précédente (login) est toujours active :

puisque j’accède toujours au formulaire de login. Est-ce normal ? Peut-on gérer ça (autrement qu’en insérant une Card par ex).

Merci !

Salut @StuntmanMike ,

Pour qu’on puisse comprendre là où tu aurais éventuellement pu faire une erreur, montre nous les parties de ton code qui gère ton système de route.

Salut @AntoLhn !

Voici, avec mise à jour en fonction de la dernière vidéo de @mbritto :

 if (genreViewModel != null) {
      final genrePage = Genre(
        menuViewModel: MenuViewModel(this),
        routerGeneral: this,
        viewModel: genreViewModel,
      );
      _displayGenre = false;
      pagesList.add(MaterialPage(
        child: genrePage,
      ));
    } else {
      final loginScreen =
          LoginScreen(LoginViewModel(LoginUseCases(_apiManager), this));
      pagesList.add(MaterialPage(child: loginScreen));
    }

    if (musicViewModel != null) {
      final musicPage = MusicPage(
          menuViewModel: MenuViewModel(this),
          routerGeneral: this,
          viewModel: musicViewModel);
      _displaymusic = false;
      pagesList.add(MaterialPage(child: musicPage));
    }

Si je comprend bien tu veux être rediriger vers ton Login si tu n’as pas de genreViewModel. Mais le soucis c’est que si tu est dans le cas où tu n’a pas de genreViewModel et que tu as un musicViewModel, tu charges quand même ta page Login …

Je crois que c’est ce qu’il se produit non ?

Ps : je n’ai plus accès aux vidéos de Maxime, je n’ai donc pas le context, ni la logique du Routeur que tu essaie de mettre en place.

Alors non, j’ai bien vérifié : le login view n’est pas reconstruit, c’est juste qu’il n’est pas détruit…

 if (_currentUser == null) {
      print("_idAdmin $_idAdmin");
      final loginScreen =
          LoginScreen(LoginViewModel(LoginUseCases(_apiManager), this));
      pagesList.add(MaterialPage(child: loginScreen));
    } else {
      //_displaySession = true;
      if (sessionViewModel != null && _displaySession == true) {
        final sessionPageNav = SessionsPage(
            menuViewModel: MenuViewModel(this),
            routerGeneral: this,
            viewModel: sessionViewModel);
        pagesList.add(MaterialPage(
          child: sessionPageNav,
        ));
        _displaySession = false;
      }

Je me dis que si c’est la même chose avec toutes les pages, je vais avoir de sérieux problèmes d’optimisation !

Salut @StuntmanMike ,

J’ai vue passer ton autre problème concernant le backButtonDispatcher. Je pense que tu as du louper un élément dans la vidéo de @mbritto.
Je te conseils de reprendre du début cette partie et de suivre pas à pas sa méthode (petit conseil, ce que je fais quand je suis vraiment bloqué, j’init un new projet Flutter et je fais en sorte de mettre en place seulement la fonctionnalité sur laquelle je bloque).

Sans connaître la méthode de Maxime, j’avoue ne pas avoir plus de solution pour toi. :frowning:

C’est pas grave c’est déjà sympa d’avoir regardé ! Clairement j’ai manqué un truc, mais les projets étant différents, j’ai pu louper un truc, pourtant je l’ai regardé un paquet de fois la vidéo :sweat_smile:

Si tu peux, participe au prochain coaching, ça pourra surement t’aiguiller dans ta réflexion. :slight_smile:

Hello,

Je reviens un peu sur le sujet, car je ne parviens vraiment à comprendre. Voici donc un peu de code :

Dans mon navigationDelegate, c’est très classique :

 if (_currentUser == null) {
      final loginScreen =
          LoginScreen(LoginViewModel(LoginUseCases(_apiManager), this));
      pagesList
          .add(MaterialPage(child: loginScreen, key: const ValueKey('login')));
      print("vérification");

et mon navigation_route_parser :

import 'package:flutter/material.dart';
import 'package:blindtest_web_plateform/navigation/navigation_path.dart';

class NavigationRouteParser extends RouteInformationParser<NavigationPath> {
  @override
  Future<NavigationPath> parseRouteInformation(
      RouteInformation routeInformation) {
    final uri = Uri.parse(routeInformation.location ?? "/");
    final String? userId;
    final String? mypage;

    if (uri.pathSegments.length == 1) {
      mypage = uri.pathSegments[0].toLowerCase();
      userId = null;
    } else {
      userId = null;
      mypage = null;
    }
    return Future.value(NavigationPath(userId: userId, page: mypage));
  }

  @override
  RouteInformation? restoreRouteInformation(NavigationPath configuration) {
    String location = "/";
    final userId = configuration.userId;
    final page = configuration.page;

    if (userId != null && configuration.page != null) {
      location = "$location$page";
    }
    print("userId = $userId");
    return RouteInformation(location: location);
  }
}

Résultat : dans mon Delegate vérification, et dans mon RouteInformation userId s’affichent bien 2 fois sans aucune autre interaction que le lancement de la webapp (et le Debug ou Release ne changent rien).

J’ai donc essayé un truc bien crade du genre :

if (_currentUser == null) {
      if (_init == false) {
        _init = true;
        final loginScreen =
            LoginScreen(LoginViewModel(LoginUseCases(_apiManager), this));
        pagesList.add(
            MaterialPage(child: loginScreen, key: const ValueKey('login')));
        print("_init = $_init");
      }

Mais à ce moment se met en erreur :

The Navigator.pages must not be empty to use the Navigator.pages API

S’agit-il d’un concept mal compris ou quelqu’un a t-il déjà eu le souci ?

Merci !