我正在try 使用以下方法从Firebase的集合中获取数据:

FirebaseFirestore.instance.collection('posts')                      
.where('datePublished', isGreaterThanOrEqualTo: 1)
.orderBy('datePublished')
.orderBy('votes', descending: true)

问题是,帖子现在是按"日期发布"的顺序列出的,但我希望帖子列表按"投票"排序.

如果我删除.orderBy('datePublished')行,我将收到此错误(Here是该错误消息中引用的文档,如果它有更多帮助的话):

error 'package:cloud_firestore/src/query.dart': Failed assertion: line 487 pos 13: 'conditionField == orders[0][0]': The initial orderBy() field "[[FieldPath([votes]), true]][0][0]" has to be the same as the where() field parameter "FieldPath([datePublished])" when an inequality operator is invoked. #0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:51:61)

感谢您的帮助,谢谢!

推荐答案

try 以下代码:

Stream<List<T>> collectionStream<T>({
  required String path,
  required T Function(Map<String, dynamic> data, String documentId) builder,
  Query<Object?> Function(Query query)? queryBuilder,
  bool Function(T)? where,
}) {
  Query<Object?> query = firestore.collection(path);
  if (queryBuilder != null) {
    query = queryBuilder(query);
  }
  Stream<QuerySnapshot<Object?>> snapshots = query.snapshots();
  return snapshots.map((snapshot) {
    List<T> result = snapshot.docs.map((snapshot) => builder(snapshot.data() as Map<String, dynamic>, snapshot.id)).where((value) => value != null).toList();
    if (where != null) {
      result.where(where);
    }
    return result;
  });
}

class Model {
  Model(this.id, this.datePublished, this.votes);

  final String id;
  final int datePublished;
  final int votes;

  factory Model.fromMap(Map<String, dynamic> data, String documentId) {
    final String? datePublished = data["datePublished"];
    final String? votes = data["votes"];

    return Model(documentId, datePublished ?? 0, votes ?? 0);
  }

  Map<String, dynamic> toMap() => {"datePublished": datePublished, "votes": votes};
}

collectionStream(
  path: "posts",
  queryBuilder: (query) => query.orderBy('votes', descending: true),
  builder: (data, documentId) => Model.fromMap(data, documentId),
  where: (model) => model.datePublished >= 94,
),

Flutter相关问答推荐

如何创建一个按钮来在Ffltter Webview中转到上一页?

如何在默认情况下隐藏appBar并在向下滚动时显示它- Flutter

blocTest错误:没有从`when()`中调用方法存根

我怎样才能在Ffltter中显示html布局链接?

升级到Ffltter 3.16后,应用程序栏、背景 colored颜色 、按钮大小和间距都会发生变化

如何将带有参数的函数传递给FIFTH中的自定义小部件

当 Dart SDK 版本范围不匹配时,为什么依赖解析器不会抛出错误?

尽管海拔设置为 0,如何删除 appBar 下的下划线

在flutter中从图库或相机中 Select 图像的方法

Flutter 动保存新的变量值

Flutter ListView 在 Column 中工作但在 Row 中不工作

在 Flutter 中使用 HardwareKeyboard 时所有键都没有响应

Show Snackbar above to showModalBottomSheet Flutter

如何扫描来自给定链接或按钮的重定向中的所有 URL?

如何从 Firebase `get()` 获取 `DocumentReference`

如何将 void 函数放入单独的 dart 文件的单独页面中

如何防止卡子在底部溢出?

Flutter 本地通知在最新版本中不起作用

一个或多个插件需要更高的 Android SDK 版本

Flutter Desktop,如何获取windows用户配置文件名称?