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

