Reputation: 9
I would like to use StreamBuilder to show data especially in my drawer (all my friends requests). However, when I use StreamBuilder (or even FutureBuilder), I have only a circular progress indicator that is loading indefinitely. I don't understand what I have this issue.
Here my code: My drawer
class FriendsRequestDrawer extends StatefulWidget {
static const String routeName = "friends_request_drawer";
const FriendsRequestDrawer({super.key});
@override
State<FriendsRequestDrawer> createState() => _FriendsRequestDrawerState();
}
class _FriendsRequestDrawerState extends State<FriendsRequestDrawer> {
@override
Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context);
return StreamBuilder<List<UserAccount>>(
stream: userProvider.getFindsRequestsAccountsStream(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
return Center(child: Text("Error: ${snapshot.error}"));
}
final userAccount = snapshot.data ?? [];
if (userAccount.isEmpty) {
return Center(child: Text("No Find Requests"));
}
return Drawer(
child: ListView.builder(
itemCount: userAccount.length,
itemBuilder: (context, index) {
return ListTile(
leading: AvatarLogo(
onPressed: () {},
width: 30,
height: 30,
border: null,
backgroundImage: userAccount[index].photoURL == null
? null
: AssetImage(userAccount[index].photoURL!),
),
title: Text(userAccount[index].pseudo),
);
},
),
);
},
);
}
}
And my getFindsRequestAccounts:
Stream<List<UserAccount>> getFindsRequestsAccountsStream() async* {
if (userAccount != null && userAccount!.findsRequest.isNotEmpty) {
List<UserAccount> findsRequestsAccounts = [];
for (Map<String, String> element in userAccount!.findsRequest) {
try {
UserAccount newUser = await DbHelper.getStreamUser(element['uid']!).first;
findsRequestsAccounts.add(newUser);
} catch (e) {
print('Error fetching user: $e');
}
}
yield findsRequestsAccounts;
} else {
yield [];
}
}
static Stream<UserAccount> getStreamUser(String uid) {
return FirebaseFirestore.instance
.collection(collectionUser)
.doc(uid)
.snapshots()
.map((snapshot) => UserAccount.fromJson(snapshot.data()!));
}
Upvotes: 0
Views: 35