Flutter-Firebase rtdb,获取 child 值 return 为空
Flutter-Firebase rtdb, fetching child values return as empty
我正在尝试从 firebase RTDB 中检索 child 的值并将它们放入列表中,但是值 return 为空,在打印列表时它也是空的。代码过去没有任何问题,我所做的唯一更改是将 Flutter 和依赖项更新到最新版本。
代码:
lastPosition() async {
print(searchID);
// This method grabs the stream of location that is being sent to the database
print("\n\n\nFetching Coordinates\n\n");
databaseReference
.child("users")
.child("Driver Coordinates")
.child(searchID)
.once()
.then(
(DataSnapshot lastPosSnapshot) {
setState(
() {
lastLatLng.add(
lastPosSnapshot.value["latitude"],
);
lastLatLng.add(
lastPosSnapshot.value["longitude"],
);
Future.delayed(
Duration(milliseconds: 100),
);
},
);
},
);
print(lastLatLng);
await getAdressBasedLocation();
}
数据是从 Firebase 异步加载的,同时您的主要代码会继续执行。在实践中,这意味着你的 print(lastLatLng);
在任何 lastLatLng.add(...)
调用之前运行,你可以通过在 then()
处理程序中添加一些日志来最容易地检查。
实际上,这意味着任何需要数据库数据的代码都必须在 回调 then
中,或者您必须使用 await
阻止 once
调用(在这种情况下,您还必须将 lastPosition
标记为 async
并在对它的任何调用中使用 await
或 then
。
因此将调用移动到 then
回调内部:
databaseReference
.child("users")
.child("Driver Coordinates")
.child(searchID)
.once()
.then((DataSnapshot lastPosSnapshot) {
lastLatLng.add(lastPosSnapshot.value["latitude"]);
lastLatLng.add(lastPosSnapshot.value["longitude"]);
print(lastLatLng); //
...
},
);
或使用 await
:
var lastPosSnapshot = await databaseReference
.child("users")
.child("Driver Coordinates")
.child(searchID)
.once();
lastLatLng.add(lastPosSnapshot.value["latitude"]);
lastLatLng.add(lastPosSnapshot.value["longitude"]);
print(lastLatLng); //
我正在尝试从 firebase RTDB 中检索 child 的值并将它们放入列表中,但是值 return 为空,在打印列表时它也是空的。代码过去没有任何问题,我所做的唯一更改是将 Flutter 和依赖项更新到最新版本。
代码:
lastPosition() async {
print(searchID);
// This method grabs the stream of location that is being sent to the database
print("\n\n\nFetching Coordinates\n\n");
databaseReference
.child("users")
.child("Driver Coordinates")
.child(searchID)
.once()
.then(
(DataSnapshot lastPosSnapshot) {
setState(
() {
lastLatLng.add(
lastPosSnapshot.value["latitude"],
);
lastLatLng.add(
lastPosSnapshot.value["longitude"],
);
Future.delayed(
Duration(milliseconds: 100),
);
},
);
},
);
print(lastLatLng);
await getAdressBasedLocation();
}
数据是从 Firebase 异步加载的,同时您的主要代码会继续执行。在实践中,这意味着你的 print(lastLatLng);
在任何 lastLatLng.add(...)
调用之前运行,你可以通过在 then()
处理程序中添加一些日志来最容易地检查。
实际上,这意味着任何需要数据库数据的代码都必须在 回调 then
中,或者您必须使用 await
阻止 once
调用(在这种情况下,您还必须将 lastPosition
标记为 async
并在对它的任何调用中使用 await
或 then
。
因此将调用移动到 then
回调内部:
databaseReference
.child("users")
.child("Driver Coordinates")
.child(searchID)
.once()
.then((DataSnapshot lastPosSnapshot) {
lastLatLng.add(lastPosSnapshot.value["latitude"]);
lastLatLng.add(lastPosSnapshot.value["longitude"]);
print(lastLatLng); //
...
},
);
或使用 await
:
var lastPosSnapshot = await databaseReference
.child("users")
.child("Driver Coordinates")
.child(searchID)
.once();
lastLatLng.add(lastPosSnapshot.value["latitude"]);
lastLatLng.add(lastPosSnapshot.value["longitude"]);
print(lastLatLng); //