我是扑朔迷离的新手,我敢肯定有一种简单的方法可以做到这一点。首先让我为您提供背景知识。我有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。但这应该从数据库中获取我的价值。我坚持了一段时间。对解决此问题有帮助吗?或者如果我想做的事情很明确,那么请向我建议一种更好的方法。预先感谢!
答案很简单:
最重要的是-您忘记使用async / await关键字,这将保证从数据库中检索同步数据。如果要连接到任何网络服务,请始终使用它们]]
使一个命令接连执行-使用。then((value){})
通过将调用函数更改为-解决了该问题>
return FutureBuilder<Device>(
future: getSpecificDevice(deviceId).then((value){
return getDeviceDescription(value.deviceKey);
}),
builder:(BuildContext context,AsyncSnapshot snapshot){