StreamBuilder gibt null zurück
Ich habe einige Probleme mit der Verwendung der firebaseUser-ID in meiner App, um Informationen von firebase abzurufen. Ich habe eine tabBar erstellt, die zwischen StreamBuildern wechselt, die eine Liste von Blöcken basierend auf Daten aus dem Firestore gemäß der Benutzer-ID von authStateChanges speichern.
Meine Funktionen, die Daten erhalten:
getFavSalons(AsyncSnapshot<QuerySnapshot> snapshot) {
return snapshot.data.docs
.map((doc) => SalonBlock(
salonName: doc.data()["salonName"],
location: doc.data()["location"],
workTime: doc.data()["workTime"],
rating: doc.data()["rating"],
))
.toList(); }
getFavMasters(AsyncSnapshot<QuerySnapshot> snapshot) {
return snapshot.data.docs
.map((doc) => MasterBlock(
fullname: doc.data()["fullName"],
bio: doc.data()["bio"],
rating: doc.data()["rating"],
))
.toList(); }
Mein StreamBuilder in TabBarView:
Container(
height: screenHeight * 0.9,
width: screenWidth,
child:
TabBarView(controller: _controllerTabs, children: <Widget>[
StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, AsyncSnapshot<User> snapshot) {
if (snapshot.hasData) {
return StreamBuilder(
stream: FirebaseFirestore.instance
.collection("customers")
.doc(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...");
}),
StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, AsyncSnapshot<User> snapshot) {
if (snapshot.hasData) {
return StreamBuilder(
stream: FirebaseFirestore.instance
.collection("customers")
.doc(snapshot.data.uid)
.collection("favMasters")
.snapshots(),
builder: (context,
AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasData) {
return Container(
margin: EdgeInsets.only(
bottom: screenHeight * 0.33),
child: new ListView(
children: getFavMasters(snapshot),
),
);
}
return LoadingSalon();
});
}
return Text("Loading user...");
]),
Wenn ich meine App am Anfang starte, sind die Daten in Blöcken vorhanden. Wenn ich jedoch versuche, zwischen Registerkarten zu wechseln, wird der Fehler "StreamBuilder hat null zurückgegeben" angezeigt. Ich denke, dass es einige Probleme mit authStateChanges () gibt. Wie kann ich dieses Problem beheben?
Antworten
Dies kann passieren, weil TabBarView Ihre Registerkarten beim Wechseln neu erstellt. Es gibt verschiedene Lösungen für dieses Problem. Um Antworten nicht zu duplizieren, lesen Sie sie hier: Beibehalten des Status zwischen den Seiten der Registerkartenansicht