如何使用2 streambuilder和Listview.builder从firestore 2集合接收数据



我使用了2个streambuilder和listviewbuilder。但是为什么会出现这个错误,而我很困惑这个代码是否能正常工作?求你了,有人知道答案吗?

我使用了streambuilder,它内部使用了ListView.builder。这意味着,首先从firestore文档中接收数据,并在检查"if"条件后,我再次使用另一个streambuilder。它内部使用ListView。但是Listview子级在这里显示了一个错误。

我想说的是,如果条件为真,那么首先从聊天集接收数据,然后在这里输入图像描述,然后再次从另一个架构集接收数据

请帮我解决这个问题。

这是我的代码

@override
Widget build(BuildContext context) {
UserModel _getCurrentUserData = new UserModel.fromMap(currentUserValue);
return StreamBuilder(
stream: FirebaseFirestore.instance
.collection('chats')
.snapshots(),
builder: (BuildContext,
AsyncSnapshot<QuerySnapshot<Map<dynamic, dynamic>>> snapshot) {
if (snapshot.hasData && snapshot.data != null) {
if (snapshot.data!.docs.isNotEmpty) {
return ListView.builder(
itemCount: snapshot.data!.docs.length,
itemBuilder: (BuildContext, int index) {
Map<dynamic, dynamic> docData =
snapshot.data!.docs[index].data();
if (snapshot.hasError)
return new Text('Error: ${snapshot.error}');
if (docData["senderId"] == _getCurrentUserData.uid ||
docData["receiverId"] == _getCurrentUserData.uid) {
return docData['senderId'] == _getCurrentUserData.uid
? StreamBuilder(
stream: FirebaseFirestore.instance
.collection(docData['receiverDept'])
.doc(docData['receiverDept'])
.collection(docData['receiverIdentity'])
.where('uid',
isEqualTo: docData['receiverId'])
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData)
return Text("Loading...");
return ListView(
children: snapshot.data!.docs <-- [show an Error][4]
.map((Map<dynamic, dynamic> document) {
return ListTile(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => chatPage3(
targetUserValue: document,
currentUserValue: currentUserValue),
),
);
},
title: Row(
children: [
Stack(
alignment: AlignmentDirectional
.bottomEnd +
AlignmentDirectional(-0.1, -0.3),
children: [
CircleAvatar(
radius: 30,
),
senderStatus == 'Online'
? Container(
width: 12,
height: 12,
// alignment: Alignment.bottomLeft,
decoration: BoxDecoration(
color: Colors.green,
shape: BoxShape.circle),
)
: Container(),
],
),
SizedBox(
width: 10,
),
Column(
mainAxisAlignment:
MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
senderName,
style: TextStyle(
fontFamily: 'JosefinSans',
fontSize: 20,
fontWeight: FontWeight.w600),
),
Text(
'Last Text',
style: TextStyle(
fontFamily: 'JosefinSans',
fontSize: 18,
color: Colors.black54,
),
),
],
),
],
),
);
}));
})
: docData["receiverId"] == _getCurrentUserData.uid
? StreamBuilder(
stream: FirebaseFirestore.instance
.collection(docData['senderDept'])
.doc(docData['senderDept'])
.collection(docData['senderIdentity'])
.where('uid',
isEqualTo: docData['senderId'])
.snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData)
return Text("Loading...");
return ListView(
children: snapshot.data!.docs.map(
(Map<dynamic, dynamic> document) {
return ListTile(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => chatPage3(
targetUserValue: document,
currentUserValue: currentUserValue),
),
);
},
title: Row(
children: [
Stack(
alignment: AlignmentDirectional
.bottomEnd +
AlignmentDirectional(
-0.1, -0.3),
children: [
CircleAvatar(
radius: 30,
),
senderStatus == 'Online'
? Container(
width: 12,
height: 12,
// alignment: Alignment.bottomLeft,
decoration:
BoxDecoration(
color: Colors
.green,
shape: BoxShape
.circle),
)
: Container(),
],
),
SizedBox(
width: 10,
),
Column(
mainAxisAlignment:
MainAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
senderName,
style: TextStyle(
fontFamily: 'JosefinSans',
fontSize: 20,
fontWeight:
FontWeight.w600),
),
Text(
'Last Text',
style: TextStyle(
fontFamily: 'JosefinSans',
fontSize: 18,
color: Colors.black54,
),
),
],
),
],
),
);
}));
})
: Container();
}
return Container();
});
} else {
return const Center(
child: Text('Document aren't availavle'),
);
}
} else {
return const Center(
child: Text('Getting Error'),
);
}
});
}

您拥有的snapshot对象是一个AsyncSnapshot,它没有docs属性。要获取文档,您需要获取snapshot.data!.docs

另请参阅我在这里对从Flutter中的Firebase加载数据时所涉及的各种类型的快照的解释:Firebase中现有类型的快照之间有什么区别?

最新更新