gpt4 book ai didi

firebase - Flutter StreamBuilder用于多个Firebase文档

转载 作者:行者123 更新时间:2023-12-03 03:00:02 25 4
gpt4 key购买 nike

当对usersCollection.document(user.uid) firebase文档进行更改时,我正在尝试更新Flutter应用程序。
更新用户文档后,我想从该文档中检索数据,也要从另一个Firebase文档facilitiesCollection.document(...)中检索数据。
我当前的代码

Future<Map> _getCheckedInFacilityData() async {
Map<String, dynamic> result = {};

try {
DocumentSnapshot userDoc =
await _db.usersCollection.document(user.uid).get();

if (userDoc.data['checkedIn']) {
// User is checked in
DocumentSnapshot facDoc = await _db.facilitiesCollection
.document(userDoc.data['activeFacilityID'].toString())
.get();

result['facilityID'] = userDoc.data['activeFacilityID'];
result['sessionID'] = userDoc.data['activeSessionID'];
result['facilityActiveUsers'] = facDoc.data['activeUsers'].length;
result['facilityName'] = facDoc.data['name'];

return result;
}
} catch (er) {
debugPrint(er.toString());
}
return null;
}
FutureBuilder<Map>(
future: _getCheckedInFacilityData(),
builder: (context, map) {
switch (map.connectionState) {
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
...
当前正在工作,但是在更改用户文档时页面不会更新。
我已经很长时间没有使用Flutter / Dart了,所以欢迎任何想法。
是否可以从 StreamBuilder返回由2个单独的文档组成的自定义对象/ map ,或者是否有其他方法可以在我的情况下使用。

最佳答案

当然,您可以使用Streams asyncMap()完成此操作,然后在StreamBuilder中进行监听
基本算法
获取您的第一个数据类型的流,然后获取asyncMap以等待第二个数据类型的流,并同时返回它们

stream.asyncMap(
(v1) async {
final v2 = await Future.delayed(Duration(seconds: 1), () => 4);
return v1 * v2;
},
);
更接近您的代码
Stream<Map<String, dynamic>> _getCheckedInFacilityData() {

return _db.usersCollection.document(user.uid).snapshots()
.asyncMap(
(userDoc) async {
final DocumentSnapshot facDoc =
await _db.facilitiesCollection
.document(userDoc.data['activeFacilityID'].toString())
.get();
final Map<String, dynamic> userMap = userDoc.data;
final Map<String, dynamic> facMap = facDoc.data;
return userMap..addAll(facMap);
},
);
}
在此函数中,我合并了两个 map -如果两个 map 具有相同的键,请小心,在我们的情况下, map 将仅保留最后一个从 addAll(facMap)添加的键
最后一步是在屏幕上显示流数据-使用 StreamBuilder
StreamBuilder<Map>(
stream: _getCheckedInFacilityData(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Text('${snapshot.error}');
} else if (snapshot.connectionState == ConnectionState.waiting) {
return LinearProgressIndicator();
}

return /* some widget that shows your data*/;
},
),

关于firebase - Flutter StreamBuilder用于多个Firebase文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62590798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com