Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Dart/Flutter] Fonctionnement de StreamBuilder

Besoin d'explications sur le fonctionnement du Widget StreamBuilder

    1 septembre 2019 à 15:55:02

    Bonjour, 

    Je suis en pleine création d'une appli utilisant le framework Flutter et le système Firebase. Mon but est de récupérer le nom d'utilisateur du compte connecté à l'appli pour l'afficher à l'écran.

    Pour ce faire, j'ai une base de données contenant la collection suivante :

    L'utilisateur courant est donc ce monsieur "testman". Pour arriver à mes fins, j'ai procédé de la sorte:

    - Utiliser le widget StreamBuilder qui permet d'écouter des valeurs asynchrones. 

    - Relier l'écoute sur une requête qui me retourne le document dont le userid correspondant à celui de l'utilisateur courant, soit "B4gfEFHIsPeqZAGXr9eoimWeCpl1".

    - Afficher le displayName du document retourné en question.

    Voici le code (profilepage.dart):

    import 'package:flutter/material.dart';
    import 'package:cloud_firestore/cloud_firestore.dart';
    import '../user_profile/auth.dart';
    
    class ProfilePage extends StatefulWidget {
      ProfilePage({this.auth, this.onSignedOut});
      final BaseAuth auth;
      final VoidCallback onSignedOut;
    
      @override
      createState() => _ProfilePageState();
    }
    
    class _ProfilePageState extends State<ProfilePage> {
      String _userID;
    
      @override
      void initState() {
        super.initState();
        setState(() {
          getUserId();
        });
      }
    
      getUserId() async {
        _userID = await widget.auth.currentUser();
        // (Après avoir vérifié avec un print) _userID = B4gfEFHIsPeqZAGXr9eoimWeCpl1 (la valeur est donc correcte)
      }
    
      @override
      Widget build(BuildContext context) {
        return Container(
            child :StreamBuilder(
              //Tous les userid sont uniques, le résultat de cette requête ne devrait donc avoir qu'un  seul document,
              // représentant l'utilisateur courant. Pourtant il renvoit tous les documents au premier chargement de la page.
                stream : Firestore.instance.collection('users').where('userid', isEqualTo: _userID).snapshots(),
                builder: (context, snapshot) {
                  //Quand on fait un "hot reload", on passe 2 fois ici et on plus 1 fois, pourquoi ?
                  // La deuxième fois, le contenu de snapshot change et correspond aux bons résultats de la requête
                  if(snapshot.data != null){
                    return Text(snapshot.data.documents[0]['displayName']);
                  } else {
                    return Center(
                        child: CircularProgressIndicator()
                    );
                  }
                }
                )
        );
      }
    }

    Au premier chargement de la page, le résultat n'est pas celui escompté, cela affiche le displayName du premier document de ma collection 'users' (car la requête renvoie toute la collection et je spécifie documents[0]).

    Cependant quand je rafraîchit la page, la requête fonctionne comme je l'espère... étrange. De plus, si je spécifie en dur _userID"B4gfEFHIsPeqZAGXr9eoimWeCpl1" lors de sa déclaration, la requête fonctionne comme je l'espère également et je ne comprend pas ce que ça change ?

    Pourquoi cette différence de résultats alors que la variable contient la même valeur dans les deux cas ? 

    Merci d'avoir vu mon post, et de m'aider si vous avez des informations pouvant m'aider à comprendre ce qu'il se passe.

    PS : J'ai mis en commentaire dans le code des informations supplémentaires obtenues lors du debug.

    • Partager sur Facebook
    • Partager sur Twitter

    [Dart/Flutter] Fonctionnement de StreamBuilder

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown