StreamBuilder restituisce null
Ho dei problemi con l'utilizzo di firebaseUser ID nella mia app per ottenere informazioni da Firebase. Ho creato tabBar che passa da StreamBuilders che memorizzano un elenco di blocchi basato sui dati di Firestore in base all'ID utente preso da authStateChanges.
Le mie funzioni che ottengono i dati:
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(); }
Il mio 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...");
]),
Quando eseguo la mia app all'inizio i dati esistono in blocchi, ma quando provo a passare da una scheda all'altra viene visualizzato un errore "StreamBuilder ha restituito null". Penso che ci siano alcuni problemi con authStateChanges (). Come posso risolvere questo problema?
Risposte
Ciò può accadere perché TabBarView ricrea le tue schede quando le cambi. Esistono diverse soluzioni a questo problema, per non duplicare le risposte, controllale qui: Preservare lo stato tra le pagine della visualizzazione scheda