Flutter中Cloud Firestore ODM如何按DateTime字段实现排序查询
Cloud Firestore ODM 自动生成orderByXxx查询方法的前提,是生成器能静态识别字段与Firestore存储类型的默认映射关系。
你当前给createdAt字段加了自定义fromJson转换逻辑,生成器无法穿透自定义方法判断该字段对应Firestore端的可排序类型,自然不会生成对应的排序方法。这不是ODM不支持DateTime字段排序,只是自定义序列化逻辑阻断了代码生成的识别流程。
Firestore服务端本身原生支持时间类型字段排序,只要字段存储为标准Timestamp格式,排序逻辑可以正常执行,和Dart侧是否转成DateTime没有关系。
使用默认序列化(推荐)
ODM本身已经内置了DartDateTime和FirestoreTimestamp的双向转换,不需要手动编写转换方法。把字段上自定义的@JsonKey注解、手写的timestampConvertFromJson转换方法删掉,直接声明字段即可:part 'item.g.dart'; class Item with ChangeNotifier { // 其余字段省略 late DateTime createdAt; }重新运行build runner执行代码生成,
orderByCreatedAt方法就会自动出现在生成的item.g.dart文件里。保留自定义转换时手动编写排序
如果你有特殊需求必须保留自定义序列化逻辑,不需要依赖生成器输出的方法,直接在构建查询的时候手动指定排序字段即可:// 按创建时间倒序取数据,参数填Firestore里实际存储的字段名 final latestItemsQuery = itemsRef.orderBy('created_at', descending: true);注意:这里传入的字段名必须和Firestore数据库中实际存储的字段名完全一致,如果通过
@JsonKey(name: '')指定了映射的数据库字段名,要以配置值为准,不要直接传Dart类的属性名。
内容的提问来源于stack exchange,提问作者funnybunny

