Julien
Julien

Reputation: 9

Using Drawer with StreamBuilder

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

Answers (0)

Related Questions