用于列表构建的 Flutter 中的 Firestore 嵌套查询
Posted
技术标签:
【中文标题】用于列表构建的 Flutter 中的 Firestore 嵌套查询【英文标题】:Firestore Nested Query in Flutter for List Building 【发布时间】:2020-02-03 12:06:19 【问题描述】:我的 Firestore 数据库中有两个集合; “查询”和“用户”。我的要求是从“查询”集合中获取有关特定标志的所有查询。完成后,我需要检查每个查询中的 uid 并使用“用户”集合中的该 uid 查询我的用户数据。在这种情况下,我在 Flutter 中使用 StreamBuilder 获取用户的姓名和号码。以下是我的做法:
return new StreamBuilder(
stream: db.collection("queries").where("isAttended", isEqualTo: false).snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot)
if(!snapshot.hasData) return new Text("Loading...");
return new ListView(
children: snapshot.data.documents.map((document)
String name = '';
String number = '';
var doc = db.collection("users").document(document["uid"]).get();
doc.then((onValue)
number = onValue.data['number'];
name = onValue.data['name'];
);
return new ListTile(
title: new Text(name),
subtitle: new Text(number),
);
).toList(),
);
,
);
问题是 onValue 返回 null。请就我上面指定的方式查询数据的方法提出建议。 TIA。
【问题讨论】:
then()
回调仅在数据加载后运行,而使用数据库数据的return new ListTile()
会立即运行。我不足以让 Flutter 专家向您展示如何做到这一点,但 this answer 显示了类似的东西(虽然不一样)。
【参考方案1】:
开始吧,
这是你的孩子名单List<Widget> children = [];
将您的 ListView
孩子更改为 ListView(children: children, ...)
然后像这样更新您的流构建器,
if(!snapshot.hasData) return new Text("Loading...");
initChildren(snapshot); // here is important
return new ListView(...
而initChildren
是
initChildren(snapshot) async
final list = await Future.wait(snapshot.data.documents.map((document) async
String name = '';
String number = '';
var doc = await db.collection("users").document(document["uid"]).get();
doc.then((onValue)
number = onValue.data['number'];
name = onValue.data['name'];
);
return new ListTile(
title: new Text(name),
subtitle: new Text(number),
);
));
setState(() => children = list);
【讨论】:
以上是关于用于列表构建的 Flutter 中的 Firestore 嵌套查询的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:集成 firestore 后在 Flutter iOS 构建中找不到“openssl/x509.h”文件
通过单击 Flutter 中的按钮,使用列表中的数据构建新容器
Flutter/Firestore - 在流构建器中的动态列表视图上实现“分页”
Flutter - 如何更新用于构建 ListView 的 Future/List 的状态(或值?)(通过 FutureBuilder)