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
相关产品推荐
相关产品推荐

