如何根据 Flutter 中 FutureBuilder 中另一个 firebase 查询的值从 firebase 查询中获取数据?
How to get data from firebase query based on value from another firebase query in FutureBuilder in Flutter?
我是 Flutter 的新手,我相信有一种简单的方法可以做到这一点。让我先给你介绍一下背景知识。我有 2 tables(集合)。第一个存储映射。因此,它 return 是一个基于 id 的键,它将用于查询第二个 table 并从 firebase 检索数据。
我编写了 2 个数据模型和 2 个函数,其中 return 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
。
这是存储在另一个 table 中的记录 的 键。以下是它的功能。
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;
}
现在这两个功能都可用。 我想让它一个接一个地工作。在上面的函数中,如果我取消对代码行的注释,则内部函数会正确检索数据,但会设置 returns 初始默认值,因为在设置 SpecificDevice 的 obj 之前这些值得到 returned .
这是我收到错误的地方。我在 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 传递)获取数据并在第二个函数中使用它。
通过将调用函数更改为 -
解决了问题
return FutureBuilder<Device>(
future: getSpecificDevice(deviceId).then((value){
return getDeviceDescription(value.deviceKey);
}),
builder:(BuildContext context,AsyncSnapshot snapshot){
我是 Flutter 的新手,我相信有一种简单的方法可以做到这一点。让我先给你介绍一下背景知识。我有 2 tables(集合)。第一个存储映射。因此,它 return 是一个基于 id 的键,它将用于查询第二个 table 并从 firebase 检索数据。
我编写了 2 个数据模型和 2 个函数,其中 return 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
。
这是存储在另一个 table 中的记录 的 键。以下是它的功能。
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;
}
现在这两个功能都可用。 我想让它一个接一个地工作。在上面的函数中,如果我取消对代码行的注释,则内部函数会正确检索数据,但会设置 returns 初始默认值,因为在设置 SpecificDevice 的 obj 之前这些值得到 returned .
这是我收到错误的地方。我在 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 传递)获取数据并在第二个函数中使用它。
通过将调用函数更改为 -
解决了问题return FutureBuilder<Device>(
future: getSpecificDevice(deviceId).then((value){
return getDeviceDescription(value.deviceKey);
}),
builder:(BuildContext context,AsyncSnapshot snapshot){