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

Firebase/Flutter:push数据后获取的key与实际插入key不匹配如何解决

问题原因

你先后调用了两次push()方法,Firebase Realtime Database的push()方法每调用一次就会在客户端生成一个全新的唯一key。你第一次调用push()拿到的newkey是第一次生成的结果,后续写入数据时又调用了一次push(),会生成第二个独立的key,所以两个key自然不一致。

解决方法

有两种常用的实现方式:

方式1:复用提前生成的key写入数据

仅调用一次push()生成key,后续直接用该key指定路径写入数据即可:

var store = FirebaseDatabase.instance.reference().child("users/"+defaultState+"/"+defaultCity);
// 仅调用一次push生成唯一key
String newkey = store.push().key;
print(newkey);
// 直接对该key对应的路径写入数据
store.child(newkey).set({
  "name": name.text,
  "address": address.text,
  "phone": phone.text,
  "state": defaultState,
  "city": defaultCity,
}).then((_) {
  // 此处可直接使用之前拿到的newkey,即为写入数据对应的key
}).catchError((onError) {
  Scaffold.of(context)
      .showSnackBar(SnackBar(content: Text(onError)));
});

方式2:从push返回的引用中获取key

调用push()后先拿到新节点的引用,写入完成后直接从引用中读取key:

var store = FirebaseDatabase.instance.reference().child("users/"+defaultState+"/"+defaultCity);
// 调用push获取新节点的引用,此时已经生成key
var newNodeRef = store.push();
newNodeRef.set({
  "name": name.text,
  "address": address.text,
  "phone": phone.text,
  "state": defaultState,
  "city": defaultCity,
}).then((_) {
  // 从引用中直接读取key
  String newkey = newNodeRef.key;
  print(newkey);
}).catchError((onError) {
  Scaffold.of(context)
      .showSnackBar(SnackBar(content: Text(onError)));
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 23:15:04