0
votes

Comment utiliser la méthode .currentUser dans Flutter

j'ai du code:

.document("HAQaVqCPRfM7h6yf2liZlLlzuLu2")

}

et une partie du code où je construis la liste:

             StreamBuilder(
                  stream: Firestore.instance
                      .collection("customers")
                      .document("HAQaVqCPRfM7h6yf2liZlLlzuLu2")
                      .collection("favSalons")
                      .snapshots(),
                  builder:
                      (context, AsyncSnapshot<QuerySnapshot> snapshot) {
                    if (snapshot.hasData) {
                      return Container(
                        margin:
                            EdgeInsets.only(bottom: screenHeight * 0.33),
                        child: new ListView(
                          children: getFavSalons(snapshot),
                        ),
                      );
                    }
                    return LoadingSalon();
                  }),

et ici j'utilise uid:

  getFavSalons(AsyncSnapshot<QuerySnapshot> snapshot) {
return snapshot.data.documents
    .map((doc) => SalonBlock(
          salonName: doc["salonName"],
          location: doc["location"],
          workTime: doc["workTime"],
          rating: doc["rating"],
        ))
    .toList();

ici, je dois utiliser currentUser au lieu de me remplir. Comment faire cela?


0 commentaires

3 Réponses :


0
votes

Assurez-vous que firebase_auth importé dans votre classe

Créez des instances de FirebaseAuth et User comme ceci:

StreamBuilder(
    stream: Firestore.instance
      .collection("customers")
      .document(currentUser.uid)
      .collection("favSalons")
      .snapshots(),
    builder:
      (context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (snapshot.hasData && snapshot.connectionState == ConnectionState.active) {
          return Container(
            margin:
                EdgeInsets.only(bottom: screenHeight * 0.33),
            child: new ListView(
              children: getFavSalons(snapshot),
            ),
          );
        }
    return LoadingSalon();
}),

Vous pouvez appeler la fonction getCurrentUser dans l'initState d'une classe Stateful pour obtenir le courant lorsque le widget est chargé comme ceci:

@override
  void initState() {
    getCurrentUser();

    super.initState();
  }

Vous pouvez maintenant changer votre code précédent en ceci:

final auth = FirebaseAuth.instance;
User currentUser;

/// Function to get the currently logged in user
  void getCurrentUser() {
      currentUser = auth.currentUser;
      if(currentUser) {
         // User is signed in
      } else {
         // User is not signed in
      }
  }

Cela devrait fonctionner pour vous maintenant :)


3 commentaires

Cela semble être des informations obsolètes, il y a eu des changements majeurs dans ce comportement. Il introduit également des conditions de concurrence qui produiront des bogues dans votre application, alors peut-être que c'était une bonne chose que le package ait été modifié.


malheureusement, il y a une erreur "Le getter 'uid' a été appelé sur null."


Vraiment? @nvoigt Je n'en savais rien. Je vais devoir l'examiner.



1
votes

FirebaseUser est actuellement obsolète, vous pouvez obtenir le CurrentUser comme indiqué ci-dessous;

FirebaseAuth.instance.currentUser;

Si vous voulez en savoir plus sur les arguments que vous pouvez utiliser, consultez leur documentation;

https://firebase.flutter.dev/docs/auth/usage


1 commentaires

Cette utilisation de votre échantillon est-elle correcte ".document (FirebaseAuth.instance.currentUser.toString ())" parce que j'ai essayé de l'imprimer et montre qu'il n'y a pas d'utilisateur autorisé pendant que je l'ai



0
votes

L'utilisateur actuel de votre application peut changer à tout moment. Par exemple:

  • Lorsque l'utilisateur démarre l'application, Firebase restaure automatiquement son état d'authentification précédent. Mais cela l'oblige à appeler le serveur, de sorte que l'utilisateur n'est brièvement pas connecté ( currentUser est null ) avant d'être connecté.
  • Lorsque l'utilisateur est connecté, Firebase actualise son état d'authentification toutes les heures pour s'assurer que sa connexion est toujours valide (et par exemple que son compte n'a pas été désactivé). Cela signifie que leur état de connexion peut changer même si vous n'appelez pas explicitement l'API.

Pour ces raisons, vous ne pouvez pas simplement appeler currentUser et vous attendre à ce qu'il reste valide. Au lieu de cela, vous devez attacher un écouteur de changement d'état d'authentification, qui vous donne un flux d'états d'authentification.

Dans votre code qui crée l'interface utilisateur, vous pouvez utiliser ce flux de données utilisateur dans un autre générateur de flux. Vous aurez donc deux générateurs de flux imbriqués:

  1. Pour l'état d'authentification de l'utilisateur.
  2. Pour la base de données, en fonction de l'utilisateur actuel.

Donc quelque chose comme (non testé pour l'instant):

 StreamBuilder(
     stream: FirebaseAuth.instance.authStateChanges(),
     builder: (context, AsyncSnapshot<User> snapshot) {
        if (snapshot.hasData) {
          return StreamBuilder(
              stream: Firestore.instance
                  .collection("customers")
                  .document(snapshot.data.uid)
                  .collection("favSalons")
                  .snapshots(),
              builder:
                  (context, AsyncSnapshot<QuerySnapshot> snapshot) {
                if (snapshot.hasData) {
                  return Container(
                    margin:
                        EdgeInsets.only(bottom: screenHeight * 0.33),
                    child: new ListView(
                      children: getFavSalons(snapshot),
                    ),
                  );
                }
                return LoadingSalon();
              }),
        }
        return Text("Loading user...");
      }),
         


3 commentaires

Il me montre une erreur sur cette ligne "stream: Firebase.instance.authStateChanges ()", comme erreur: "Nom non défini 'Firebase'.Essayez de corriger le nom en celui qui est défini ou de définir le nom."


De plus, lorsque je change Firebase en FirebaseAuth, authStateChanges () affiche une erreur car elle n'est pas définie dans cette méthode


# 1) Ouais, c'était une erreur de copier / coller de la documentation. Je l'ai mis à jour. Je recommande vivement de résoudre ces problèmes vous-même, car il ne devrait pas être difficile de trouver la syntaxe correcte à partir du lien que j'ai également fourni. 2) Si cela persiste, vérifiez la version de la bibliothèque que vous utilisez.