You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中对比API返回日期后在ListView分类展示异常问题求助

问题排查与修复方案

1. 核心展示逻辑错误

你所有ListView.builder的itemBuilder中都调用dataStore.getItemByIndex(index),取值来自原始全量数据列表的对应下标,和你筛选得到的todayItems/tomorrowItems/thisWeekItems完全没有关联。比如明日列表筛选出2条数据,你渲染的却是原始列表的前2条数据,自然会出现日期不匹配、条目缺失、长度不符的问题。
修复方案:每个列表取对应筛选结果的下标数据即可

// 今日列表itemBuilder内取值
Data items = todayItems[index];
// 明日列表itemBuilder内取值
Data items = tomorrowItems[index];
// 本周列表itemBuilder内取值
Data items = thisWeekItems[index];

2. 本周筛选逻辑错误

你当前的本周筛选逻辑是判断数据日期和本周一是否为同一天,只能筛出周一的条目,不符合「本周所有数据」的需求。
修复方案:新增周范围判断逻辑替换原有筛选

// 新增判断是否属于同一周的工具方法(默认周首为周一,可按需调整)
bool isSameWeek(DateTime targetDate, DateTime currentDate) {
  // 统一转成零点日期,排除时分秒的干扰
  final target = DateTime(targetDate.year, targetDate.month, targetDate.day);
  final current = DateTime(currentDate.year, currentDate.month, currentDate.day);
  // 计算当前周的起止日期
  final firstDayOfWeek = current.subtract(Duration(days: current.weekday - 1));
  final lastDayOfWeek = firstDayOfWeek.add(const Duration(days: 6));
  // 判断目标日期是否在本周范围内
  return target.isAfter(firstDayOfWeek.subtract(const Duration(days: 1))) 
      && target.isBefore(lastDayOfWeek.add(const Duration(days: 1)));
}

// 替换原有本周筛选代码
final thisWeekItems = dataStore.list
    .where((e) => isSameWeek(DateTime.parse(e.pickupTime), DateTime.now()))
    .toList();

3. 可选优化点(避免潜在问题)

  • 统一日期基准:多处调用DateTime.now()可能出现跨天判断不一致的问题,建议提前统一生成当前日期基准
    final now = DateTime.now();
    final today = DateTime(now.year, now.month, now.day);
    final tomorrow = today.add(const Duration(days: 1));
    
  • 时区统一:如果API返回的是UTC时间,解析后需要转成本地时间再做对比,避免时差导致的日期判断错误
    DateTime.parse(e.pickupTime).toLocal()
    
  • 性能优化:多层嵌套shrinkWrap: true的ListView会存在性能损耗和滑动冲突,建议替换为Column直接构建子项,或者使用CustomScrollView+SliverList实现。

内容的提问来源于stack exchange,提问作者GrandMagus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:09:02