如何按日期筛选并列出Firestore中的数据?
解决Firestore按日期筛选同一天数据的问题
你的代码里odeme['bitis'] == tarih不生效,核心原因是DateTime对象的比较会精确到时分秒,而Firestore中存储的bitis字段大概率包含具体时间(比如Timestamp类型),和你从DatePicker获取的pickedDate(默认是当天00:00:00)无法完全匹配。下面是两种解决思路:
一、客户端过滤(快速修改现有代码)
先将Firestore中的
bitis字段转换为DateTime对象:- 如果
bitis是Timestamp类型:DateTime bitisDate = (odeme['bitis'] as Timestamp).toDate(); - 如果
bitis是存储的日期字符串(比如dd.MM.yyyy格式):DateTime bitisDate = DateFormat('dd.MM.yyyy').parse(odeme['bitis']);
- 如果
编写一个只比较年月日的辅助函数:
bool isSameDay(DateTime date1, DateTime date2) { return date1.year == date2.year && date1.month == date2.month && date1.day == date2.day; }修改筛选条件,替换原来的
odeme['bitis'] == tarih:if (searchString == '' || odeme['firma'].toString().toLowerCase().contains(searchString.toLowerCase()) || odeme['alici'].toString().toLowerCase().contains(searchString.toLowerCase()) || odeme['odeme'].toString().toLowerCase().contains(searchString.toLowerCase()) || isSameDay(bitisDate, tarih)) { // ... 返回列表项 }
二、Firestore查询层面过滤(更高效推荐)
客户端过滤会加载所有数据再筛选,数据量大时性能差。推荐直接在Firestore的查询中限定日期范围:
计算所选日期的当天起始和结束时间:
// 所选日期的00:00:00 DateTime startOfDay = DateTime(tarih.year, tarih.month, tarih.day); // 次日的00:00:00,作为结束边界 DateTime endOfDay = startOfDay.add(const Duration(days: 1));修改FirestoreListView的query参数:
FirestoreListView<Map<String, dynamic>>( shrinkWrap: true, query: FirebaseFirestore.instance .collection('odemeler') // 结合其他筛选条件,比如搜索字符串(如果需要) .where('bitis', isGreaterThanOrEqualTo: startOfDay) .where('bitis', isLessThan: endOfDay), itemBuilder: (context, snapshot) { Map<String, dynamic> odeme = snapshot.data(); // 这里可以保留其他搜索条件的过滤 if (searchString == '' || odeme['firma'].toString().toLowerCase().contains(searchString.toLowerCase()) || odeme['alici'].toString().toLowerCase().contains(searchString.toLowerCase()) || odeme['odeme'].toString().toLowerCase().contains(searchString.toLowerCase())) { return Column(children: [ const SizedBox(height: 10), // ... 你的列表项代码 ]); } return const SizedBox.shrink(); // 不匹配的返回空组件 }, )
注意:如果
bitis字段是Timestamp类型,Firestore会自动处理DateTime和Timestamp的比较,无需额外转换。
内容的提问来源于stack exchange,提问作者hilal
相关产品推荐
相关产品推荐

