This is the code I tried
Stream<QuerySnapshot> _usersStream = FirebaseFirestore.instance .collection("ChatRoom") .where("users", arrayContains: Constant.myname) .snapshots();
@override
Widget ChatMessageList() { return StreamBuilder(
// stream: chatMessageStream,
stream: _usersStream,
builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.data == null) {
return Center(
child: CircularProgressIndicator(
color: Colors.orange.shade600,
));
} else {
return Container(
padding: EdgeInsets.only(top: 15),
height: MediaQuery.of(context).size.height / 1.2,
child: ListView.builder(
itemCount: snapshot.data!.docs.length,
itemBuilder: (ctx, index) {
QuerySnapshot<Object?>? snap = snapshot.data; // Snapshot
List<DocumentSnapshot> items =
snap!.docs; // List of Documents
DocumentSnapshot item = items[index];
String v = item['chatroomid'];
return SingleChildScrollView(
child: StreamBuilder(
stream: FirebaseFirestore.instance
.collection("ChatRoom/$v/chats")
.orderBy("time", descending: true)
.limit(1)
.snapshots(),
builder: (context, snapshot2) {
if (snapshot2.hasData) {
QuerySnapshot<Object?>? snap2 =
snapshot2.data; // Snapshot
List<DocumentSnapshot?>? items2 =
snap2?.docs; // List of Documents
DocumentSnapshot? item2 = items2?[0];
print(item2?['message']);
return MessageTile(
username: item['chatroomid']
.toString()
.replaceAll("_", "")
.replaceAll(Constant.myname, ""),
chatroomid: item['chatroomid'],
);
} else {
return CircularProgressIndicator();
}
}),
);
}),
);
}
});
}
This is the code. One streamBuilder to get the users with where Condition. ListViewBuilder to Display users and second streamBuilder to fetch the last message from the chat sub collection.
But I am facing this issue:
2
Answers
Based on the error image, I believe your issue is coming from here:
You are assuming that there will always be a document in the list. You need to consider an empty list scenario.
why can you use
combinestream
using rxdart