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?
3 Réponses :
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 :)
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.
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;
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
L'utilisateur actuel de votre application peut changer à tout moment. Par exemple:
currentUser
est null
) avant d'être connecté. 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:
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..."); }),
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.