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

Flutter3环境下Firebase set()写入数据重复未更新子节点值问题

Firebase Realtime Database 写入重复数据问题

问题现象

执行写入操作后数据持续重复生成,未按预期更新目标路径下的子节点值,对应业务逻辑在升级至Flutter 3之前可正常运行,无异常。

问题代码

var dailydata = database_Reference
    .child("users")
    .child(SharedPref.userUid!)
    .child("dayliRecords")
    .child(date);

dailydata.set({
  "name": SharedPref.user_id,
  "router_bssid": thisWifiObject!.bssId,
  "date": dailyWorkTime,
  "startingTime": startingTime,
  "endingTime": endingTime,
  "totalWorkTime": SharedPref.hours == 0 ? 0 : SharedPref.hours,
  "percent": SharedPref.percent == 0 ? 0.0 : SharedPref.percent,
  "connectedfrom": thisWifiObject!.macAddress,
});

异常状态

Firebase控制台中呈现的异常数据状态:
Firebase控制台异常数据截图

排查与解决方向

  • 排查写入逻辑触发时机:Flutter 3调整了组件重建机制,若这段写入逻辑写在build()方法、未做防重处理的initState()回调、或自动触发的数据流监听回调中,组件高频重建时会重复触发写入。Flutter 2与3.x版本的组件重建触发频次存在差异,是升级前正常、升级后出问题的核心诱因之一。
  • 校验路径参数date的取值:写入路径的末级子节点由date变量决定,若每次执行写入时date生成的值不一致(比如误拼接了毫秒时间戳、格式化逻辑带动态后缀),会持续在dayliRecords节点下创建新子节点,而非更新原有路径的数据。可在调用set()前打印完整写入路径,确认多次触发时路径是否完全一致。
  • 检查离线持久化队列:若开启了Firebase实时数据库的离线持久化功能,需确认写入逻辑没有被重复注册到监听回调中,避免相同写入请求被多次加入本地待同步队列,联网后重复提交生成冗余数据。
  • 增加业务层防重:给写入操作加执行状态锁,同一路径的写入请求未返回执行结果前,拦截后续重复调用,从业务层避免重复写入。

内容的提问来源于stack exchange,提问作者OMAR R A SHAIKHOMAR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:09:16