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

Flutter双重刷新仍失效 编辑3个商品后应用内数据不更新

问题根因
  • 核心诱因是Google Sheets开启自动排序后,行的位置会在数据更新后自动变动,但你代码里一直用本地列表的固定index作为Sheets行的定位依据,连续编辑3次后本地索引和Sheets实际行号完全错位:后续的更新请求要么打到了错误的行,要么直接触发索引越界的静默错误,Google Sheets端你看到的正常更新是前几次索引还没完全错位时的结果,后续请求实际已经没有正确写入/拉取对应数据,界面自然不会刷新。
  • 你当前的刷新逻辑完全无效:pushNewDate执行完立刻调用setState时,还没等Sheets完成排序、返回最新数据,后续加的1秒延迟刷新属于“碰运气”式逻辑,网络波动、Sheets排序耗时稍长时根本等不到最新数据,而且索引错位后就算刷再多次也拿不到正确结果。
  • 所有网络请求没有做错误捕获,请求失败(比如索引越界、接口限流)时完全没有日志和提示,你根本感知不到后台请求已经出错,只会看到界面不动。
修复方案
  • 第一步:废弃用本地index定位Sheets行的逻辑,给每个商品增加一列固定的唯一标识(比如自增ID、商品货号、生成的UUID),这个值不会随排序改变。每次更新数据时,先通过唯一标识查询到商品在Sheets里的当前实际行号,再执行更新操作,从根源上避免排序导致的索引错位。
  • 第二步:调整数据同步逻辑,每次更新请求执行成功后,主动重新拉取一次Sheets端的全量最新商品列表,用服务端返回的排序后真实数据完全替换本地持有的列表数据,再调用setState刷新界面,删掉之前加的延迟1秒刷新的冗余代码。
  • 第三步:给所有和Sheets交互的网络请求加try-catch错误捕获,请求出错时打印日志或给出提示,不要让错误静默发生。
修正后的核心代码参考
Future<void> _updateDate(BuildContext context) async {
  final DateTime? nD = await showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime(1901, 1),
      lastDate: DateTime(2100)
  );

  if (nD != null && nD != oD) {
    try {
      // 不再传本地index,改为传当前商品的固定唯一ID
      await widget.provider.pushNewDateById(_nDF, widget.currentItem.uniqueId);
      // 更新成功后主动拉取最新全量数据,替换本地缓存列表
      await widget.provider.fetchLatestItemList();
      // 校验页面挂载状态后再刷新,避免生命周期错误
      if (mounted) {
        setState(() {});
      }
    } catch (e) {
      // 打印错误日志方便定位问题
      debugPrint('更新日期失败: $e');
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
            const SnackBar(content: Text('更新失败,请重试'))
        );
      }
    }
  }
}

注意:你需要对应修改provider层的实现:pushNewDateById要先根据传入的唯一ID查询商品在Sheets中的当前真实行号再执行更新,fetchLatestItemList负责拉取排序后的最新全量商品数据覆盖本地缓存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:24:15