StreamBuilder zwraca null
Mam problemy z używaniem identyfikatora użytkownika firebase w mojej aplikacji w celu uzyskania informacji z firebase. Stworzyłem tabBar, który przełącza się między StreamBuilderami, które przechowują listę bloków na podstawie danych z Firestore według identyfikatora użytkownika pobranego z authStateChanges.
Moje funkcje pobierające dane:
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(); }
Mój StreamBuilder w 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...");
]),
Kiedy uruchamiam moją aplikację na początku, dane istnieją w blokach, ale kiedy próbuję przełączać się między kartami, pojawia się błąd „StreamBuilder zwrócił wartość null”. Myślę, że są problemy z authStateChanges (). Jak mogę rozwiązać ten problem?
Odpowiedzi
Może się tak zdarzyć, ponieważ TabBarView odtwarza twoje karty po ich przełączeniu. Istnieją różne rozwiązania tego problemu, aby nie powielać odpowiedzi, sprawdź je tutaj: Zachowywanie stanu między stronami widoku kart