0

我有一个这样的流的组合列表;

var Ref1 = _firestore
      .collectionGroup("Posts")
      .where('postID', whereIn: List1)
      .snapshots();
  var Ref2 = _firestore
      .collectionGroup("Posts")
      .where('postID', whereIn: List2)
      .snapshots();
  var Ref3 = _firestore
      .collectionGroup("Posts")
      .where('postID', whereIn: List3)
      .snapshots();
  
  List<Stream<QuerySnapshot>> combineList = [Ref1, Ref2, Ref3];

使用这种方法,我将来自combineList;的 Streams 合并。

var totalRef = StreamGroup.merge(combineList);

然后我用totalRefinside StreamBuilder

StreamBuilder<QuerySnapshot>(
                      stream: totalRef,
                      builder:
                          (BuildContext context, AsyncSnapshot asyncsnapshot) {
                        if (asyncsnapshot.hasError) {
                          return Center(
                            child: Text("Error"),
                          );
                        } else {
                          if (asyncsnapshot.hasData) {
                            List<DocumentSnapshot> listOfDocumentSnapshot =
                                asyncsnapshot.data.docs;
                            return ListView.builder(
                              physics: ScrollPhysics(),
                              shrinkWrap: true,
                              itemCount: listOfDocumentSnapshot.length,
                              itemBuilder: (BuildContext context, int index) {
                                return Padding(
                                  padding: const EdgeInsets.symmetric(
                                      horizontal: 12.0, vertical: 12.0),
                                  child: Container(
                                    child: Column(
                                      children: <Widget>[
                                        Stack(
                                          children: <Widget>[
                                            Align(
                                              alignment: Alignment.topCenter,
                                              child: ClipRRect(
                                                borderRadius:
                                                BorderRadius.circular(24),
                                                child: GestureDetector(
                                                  onTap: () => navigateToDetail(
                                                      listOfDocumentSnapshot[
                                                      index]),
                                                  child: Image(
                                                    height: 320,
                                                    width: 320,
                                                    fit: BoxFit.cover,
                                                    image: NetworkImage(
                                                        listOfDocumentSnapshot[
                                                        index]["photo"]),
                                                  ),
                                                ),
                                              ),
                                            ),
                                          ],
                                        ),
                                      ],
                                    ),
                                  ),
                                );
                              },
                            );
                          }
                           else {
                            return Center(
                              child: CircularProgressIndicator(
                                color: Colors.orangeAccent[400],
                              ),
                            );
                          }
                        }
                      },
                    ),

但是我在这里遇到了一个问题。当我在 StreamBuilder 中使用 totalRef 时,通常情况下,3 个合并流的所有结果都应该显示在 StreamBuilder 中,但我只在 StreamBuilder 中显示最后一个流(Ref3)的数据。

在我遇到这个问题后,我了解到我必须在列表中定义我合并的流,StreamBuilder并尝试了以下操作;

List<QuerySnapshot> querySnapshot =
                                asyncsnapshot.data.toList();

                            List<DocumentSnapshot> listOfDocumentSnapshot = [];

                            querySnapshot.forEach((query) {
                              listOfDocumentSnapshot.addAll(query.docs);
                            });

但是当我尝试这个时,我得到了以下错误:Class '_JsonQuerySnapshot' has no instance method 'toList'.

收到该错误后,我尝试了另一种方法;

List<QuerySnapshot> querySnapshot;

for (int i = 0; i < combineList.length; i++) {
  querySnapshot.add(asyncsnapshot.data[i]);
 }
                            
 List<DocumentSnapshot> listOfDocumentSnapshot = [];

 querySnapshot.forEach((query) {
  listOfDocumentSnapshot.addAll(query.docs);
 });

我在这个中也遇到了类似的问题:Class '_JsonQuerySnapshot' has no instance method '[]'.

有问题,但我不明白问题是什么,如何显示所有数据流。

4

0 回答 0