2 votes

pourquoi firebase auth ne peut pas reconnaître l'utilisateur connecté après que l'application soit retirée de la tâche ?

J'essaie de faire en sorte que l'application sache si l'utilisateur est connecté ou non. s'il est connecté, il est redirigé vers la page d'accueil. sinon, il est dirigé vers la page de destination.

l'application semble fonctionner correctement si je redémarre l'ensemble de l'application ou si je ferme simplement l'application sans la retirer de la tâche. cependant, si je ferme l'application et la retire de la tâche, elle m'amène à la page de destination alors qu'en fait, l'utilisateur est toujours connecté.

Voici ce que j'utilise pour déterminer si l'utilisateur est connecté. Si c'est le cas, il est redirigé vers la page d'accueil, sinon vers la page de destination.

class LandingOrHome extends StatefulWidget {
  @override
  _LandingOrHomeState createState() => _LandingOrHomeState();
}

class _LandingOrHomeState extends State<LandingOrHome> {

  var onlineCurrentUser;

  FirebaseUser getCurrentUser() {

    FirebaseAuth.instance.currentUser().then((currentUser) {
      if (currentUser != null) {
        onlineCurrentUser = currentUser;
      }
    });

    if (onlineCurrentUser != null) return onlineCurrentUser;
    return null;
  }

  @override
  Widget build(BuildContext context) {
    if (getCurrentUser() != null)
      return HomeScreen();
    else
      return LandingScreen();
  }
}

main.dart

 //...
    home: LandingOrHome()

1voto

Claudio Redi Points 34297

Pour autant que je sache, le problème est que getCurrentUser n'attend pas FirebaseAuth jusqu'à la fin pour qu'il soit toujours nul la première fois.

Utilisez un FutureBuilder pour construire votre widget en fonction d'un résultat futur

class LandingOrHome extends StatefulWidget {
  @override
  _LandingOrHomeState createState() => _LandingOrHomeState();
}

class _LandingOrHomeState extends State<LandingOrHome> {
  Future<FirebaseUser> getCurrentUserFuture;

  @override
  void initState() {
    // Future needs to be built before build, if you do it on build it will be executed every time the widget is recreated
    getCurrentUserFuture = getCurrentUser();
    super.initState();
  }

  Future<FirebaseUser> getCurrentUser() => FirebaseAuth.instance.currentUser();

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: getCurrentUserFuture,
        builder: (context, snapshot){
          if (!snapshot.hasData) {
            // data is being loaded, return a loading indicator or something
            // to let the user know that something is in progress
          }

          if (snapshot.data != null)
            return HomeScreen();
          else
            return LandingScreen();
        });
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X