Flutter如何从List中筛选指定起止日期范围对应的DataTable行数据
Flutter 按日期范围筛选DataTable数据实现方案
你之前的排序和日期间隔计算没有命中筛选逻辑的核心需求:需要把每条数据的日期和选中的起止日期做逐一比对,保留符合区间要求的条目。具体实现步骤如下:
步骤1:处理日期格式统一问题
你存储在UserView中的日期是yyyy-mm-dd格式的字符串,而showDatePicker返回的是DateTime类型,首先需要统一两种数据的格式,同时消除时分秒带来的边界误差:
- 字符串日期直接用
DateTime.parse()转换即可,你的日期格式符合标准解析规则 - 对选中的起止日期做时分秒清零处理,避免选中日期的默认0点时间导致当天数据被误筛
步骤2:编写筛选逻辑
直接用List的where()方法做遍历筛选即可,额外兼容起止日期选反的异常场景:
// 可直接调用的筛选后数据getter List<UserView> get filteredUserList { // 自动处理起止日期选反的情况 final validStart = from.isBefore(to) ? from : to; final validEnd = from.isAfter(to) ? from : to; // 统一清零时分秒,避免边界误差 final start = DateTime(validStart.year, validStart.month, validStart.day); final end = DateTime(validEnd.year, validEnd.month, validEnd.day, 23, 59, 59); return _usersViewData.where((userItem) { final itemDate = DateTime.parse(userItem.date); // 判断条目日期是否在[start, end]闭区间内 return itemDate.isAfter(start) && itemDate.isBefore(end) || itemDate.isAtSameMomentAs(start) || itemDate.isAtSameMomentAs(end); }).toList(); }
步骤3:绑定到DataTable渲染
直接把筛选后的列表用来生成DataTable的行即可:
DataTable( columns: const [ DataColumn(label: Text('日期')), DataColumn(label: Text('描述')), DataColumn(label: Text('金额')), DataColumn(label: Text('状态')), ], // 用筛选后的数据生成行 rows: filteredUserList.map((user) { return DataRow(cells: [ DataCell(Text(user.date)), DataCell(Text(user.description)), DataCell(Text(user.amount.toString())), DataCell(Text(user.status == '0' ? '未处理' : '已处理')), ]); }).toList(), )
可选优化:结合排序逻辑
如果你需要筛选后的数据按日期排序,可以在筛选完成后直接调用排序方法:
return _usersViewData.where(...).toList() ..sort((a, b) => DateTime.parse(a.date).compareTo(DateTime.parse(b.date)));
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

