如何根据Flutter中FutureBuilder中另一个Firebase查询的值从Firebase查询中获取数据?

问题描述 投票:0回答:2

我是扑朔迷离的新手,我敢肯定有一种简单的方法可以做到这一点。首先让我为您提供背景知识。我有2个表(集合)。第一个存储映射。因此,它基于ID返回一个键,该键将用于查询第二个表并从Firebase检索数据。

我已经编写了2个数据模型和2个函数,它们返回Future<>数据。它们如下-

Future<SpecificDevice> getSpecificDevice(String deviceId) {
    Future<SpecificDevice> obj =_database.reference().child("deviceMapping").orderByChild("deviceId").equalTo(deviceId).once().then((snapshot) {
      SpecificDevice specificDevice = new SpecificDevice(deviceId, "XXXX", new List<String> ());
      if(snapshot.value.isNotEmpty){
        print(snapshot.value);
        snapshot.value.forEach((key,values) {
          if(values["deviceId"] == deviceId) {
            specificDevice.deviceKey = values["deviceDesc"];
            specificDevice.vendorList = List.from(values["vendorList"]);
          }
        });
      }
      return specificDevice;
    });
    return obj;
  }

此函数获取映射deviceId -> deviceKey。这是存储在另一个表中的记录键。以下是它的功能。

Future<Device> getDeviceDescription(String deviceKey) {
    Future<Device> device = _database.reference().child("deviceDescription").once().then((snapshot) {
      Device deviceObj = new Device("YYYY", "YYYY", "YYY", "YYYY", "YYYY");
      if(snapshot.value.isNotEmpty){
        print(snapshot.value);
        //Future<SpecificDevice> obj = getSpecificDevice(deviceId);
        //obj.then((value) {
          snapshot.value.forEach((key,values) {
            if(key == deviceKey) { // compare with value.deviceKey instead
              print(values["deviceDescription"]); // I get the correct data here.
              deviceObj.manual = values["deviceManual"];
              deviceObj.deviceType = values["deviceType"];
              deviceObj.description = values["deviceDescription"];
              deviceObj.brand = values["deviceBrand"];
              deviceObj.picture = values["devicePicture"];
            }
         // });
        });
      }
      return deviceObj;
    });
    return device;
  }

现在这两个功能都起作用我想使其一个接一个地工作。在上面的函数中,如果我取消注释了代码行,则可以在内部函数中正确检索数据,但是它会返回设置的初始默认值,因为在设置SpecificDevice的obj之前会返回这些值。

这里是我得到错误的地方。我正在调用FutureBuilder <>代码中的第二个函数,其中未注释上述行,并将输入参数作为deviceId。

return FutureBuilder<Device>(
              future: getDeviceDescription(deviceId),
              builder:(BuildContext context,AsyncSnapshot snapshot){... // using snapshot.data in its child.

此处为snapshot.data。会给我YYYY。但这应该从数据库中获取我的价值。我坚持了一段时间。对解决此问题有帮助吗?或者如果我想做的事情很明确,那么请向我建议一种更好的方法。预先感谢!

firebase flutter dart firebase-realtime-database datamodel
2个回答
0
投票

答案很简单:

  1. 最重要的是-您忘记使用async / await关键字,这将保证从数据库中检索同步数据。如果要连接到任何网络服务,请始终使用它们]]

  2. 使一个命令接连执行-使用。then((value){})

  3. 。它将从第一个函数(您使用return传递)获得数据,并在第二个函数中使用它。

0
投票

通过将调用函数更改为-解决了该问题>

return FutureBuilder<Device>(
              future: getSpecificDevice(deviceId).then((value){
                return getDeviceDescription(value.deviceKey);
              }),
              builder:(BuildContext context,AsyncSnapshot snapshot){
© www.soinside.com 2019 - 2024. All rights reserved.