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 并在对它的任何调用中使用 awaitthen

因此将调用移动到 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); //