坚持使用Firebase和Flutter的方式,可以在Streambuilder内部使用Streambuilder。也就是说,不要将FutureBuilder用于嵌套数据,而是让您等待每个.get请求。
(该代码未经测试,但原理已通过测试。)
class MessageList extends StatelessWidget { MessageList({this.firestore}); final Firestore firestore; @override Widget build(BuildContext context) { Map UserSnapshot = Map(); // create a variable for accessing users by id return StreamBuilder<QuerySnapshot>( stream: firestore.collection('users').snapshots(), builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> UsersSnapshot) { // process usersnapshot from list to map UsersSnapshot.data.documents.forEach((userRecord) { //print(optionRecord.documentID); // debug UserSnapshot[userRecord.documentID] = userRecord; }); // user data can be accessed as soon as there is a reference field or documentID: // UserSnapshot[document['userRef']]['userName'} return StreamBuilder<QuerySnapshot>( stream: firestore.collection('messages').snapshots(), builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> MessagesSnapshot) { if (!MessagesSnapshot.hasData) return const Text('Loading...'); final int messageCount = MessagesSnapshot.data.documents.length; return ListView.builder( itemCount: messageCount, itemBuilder: (_, int index) { final documentSnapshot document =MessagesSnapshot.data.documents[index]; // document['userRef'] exists here // UserSnapshot[document['userRef']]['userName'} is accessible here return ListTile( title: Text(document['message'] ?? '<No message retrieved>'), subtitle: Text('Message ${index + 1} of $messageCount'), ); }, ); }, ); }); }}


