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

