Flatter Firebase如何查询按列表索引排序的集合

Flatter Firebase如何查询按列表索引排序的集合,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我有这个列表,文档ID是字符串; 我想在CloudFireStore中查询一个集合,该集合按照myRecipes列表的顺序返回这些文档 List myRecipes= ['N1UXCMR0flbBg6mfvimB','1UXvdsffR0flbBg6mfvimB','mcmXCMR0flbBg6mfvimB']; StreamBuilder( stream: Firestore.instance .collection('recipes')

我有这个列表,文档ID是字符串; 我想在CloudFireStore中查询一个集合,该集合按照myRecipes列表的顺序返回这些文档

List myRecipes= ['N1UXCMR0flbBg6mfvimB','1UXvdsffR0flbBg6mfvimB','mcmXCMR0flbBg6mfvimB'];

StreamBuilder(
        stream:  Firestore.instance
                  .collection('recipes')
                  .where(FieldPath.documentId,
                      whereIn: myLRecipes)
                  .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Container();
          }
          return GridView.builder(
              itemCount: snapshot.data.documents.length,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2,
              ),
              itemBuilder: (BuildContext context, int index) {
                return  Text(snapshot.data.documents[index]['recipeName']),
                ;
              });
        });
当我运行此程序时,它会按照Firestore的顺序返回配方,但我想返回它们在myRecipes列表中的状态,因此显示的第一个文本小部件将是myRecipes[0]

我也尝试过listen()方法,但它给了我这个错误

类型“\u ForwardingStreamSubscription”不是“Stream”类型的子类型

请帮帮我我已经试了好几天了

List myRecipes= ['N1UXCMR0flbBg6mfvimB','1UXvdsffR0flbBg6mfvimB','mcmXCMR0flbBg6mfvimB'];

StreamBuilder(
        stream:  Firestore.instance
                  .collection('recipes')
                  .where(FieldPath.documentId,
                      whereIn: myLRecipes)
                  .snapshots().listen((event) {
            event.documents.sort((a, b) {
              return a.documentID
                  .indexOf(myRecipes.first)
                  .compareTo(myRecipes.last);
            });
          }),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Container();
          }
          return GridView.builder(
              itemCount: snapshot.data.documents.length,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2,
              ),
              itemBuilder: (BuildContext context, int index) {
                return  Text(snapshot.data.documents[index]['recipeName']),
                ;
              });
        });
我尝试了transform,但不知道如何正确使用它。这是我的密码

List myRecipes= ['N1UXCMR0flbBg6mfvimB','1UXvdsffR0flbBg6mfvimB','mcmXCMR0flbBg6mfvimB'];

StreamBuilder(
        stream: Firestore.instance
                .collection('products')
                .where(FieldPath.documentId,
                    whereIn: snapshot.data.data['favorites'].toList())
                .snapshots()
                .transform(StreamTransformer.fromBind((event) {
          event.listen((event) {
            return event.documents.sort((a, b) {
              return a.documentID
                  .indexOf(myRecipes.first)
                  .compareTo(myRecipes.last);
            });
          });
        })));
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return Container();
          }
          return GridView.builder(
              itemCount: snapshot.data.documents.length,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2,
              ),
              itemBuilder: (BuildContext context, int index) {
                return  Text(snapshot.data.documents[index]['recipeName']),
                ;
              });
        });

这不会给我一个错误,但它不会返回任何小部件。

没有选项按照您在客户端列表中的顺序检索文档。检索完文档后,您必须在应用程序代码中对其重新排序。

没有选项可以按照您在客户端列表中的顺序检索文档。检索完应用程序代码中的文档后,您必须对其重新排序。

Firebase实时数据库和Cloud Firestore是两个独立的数据库。请仅使用相关标签标记您的问题,而不是同时使用两者。Firebase实时数据库和Cloud Firestore是两个独立的数据库。请仅使用相关标签标记您的问题,而不是同时使用这两个标签。我如何才能做到这一点?如果您使用
listen()
查看
snapshots()
,您将获得一个带有。你可以重新排序,然后返回。如果您在我执行此操作时遇到问题,请编辑您的问题以显示您尝试的代码。如果您在执行此操作时遇到问题,请编辑您的问题以显示您尝试的代码。我已经编辑了它(非常感谢您的帮助和耐心!)我想您需要的是
转换
,而不是倾听,代码将数据从
查询快照
转换为
列表
。进行排序的代码可以保持不变(假设实际的排序是您想要的),但是您需要返回
event.documents.sort(…)
(因此需要使用
transform
)…我该如何做呢?如果您
收听
快照()
,您会得到一个带有。你可以重新排序,然后返回。如果您在我执行此操作时遇到问题,请编辑您的问题以显示您尝试的代码。如果您在执行此操作时遇到问题,请编辑您的问题以显示您尝试的代码。我已经编辑了它(非常感谢您的帮助和耐心!)我想您需要的是
转换
,而不是倾听,代码将数据从
查询快照
转换为
列表
。进行排序的代码可以保持不变(假设实际排序是您想要的),但您需要返回
event.documents.sort(…)
(因此需要使用
transform
)的结果。。