【发布时间】:2021-11-09 03:54:16
【问题描述】:
我正在使用Provider 和Firestore 来获取一些在其数据模型中使用Document Reference Type 的文档
有没有一种好方法可以在同一个“小部件构建”通道中同时获取数据和嵌套引用?
我可以检索数据,并且可以从数据中构建我的类和小部件,但在检索到引用的文档后我无法更新小部件。
相关对象的数据模型如下所示:
{
name: "Check name",
modifiers: [1, 2 ,3],
stats: [stat_reference_one, stat_reference_two]
}
其中stat_reference_one 是路径和引用类型。它的路径是:"/users/.../.../checks/:id"
在我的数据服务中,我有以下代码:
class DataService {
final FirebaseFirestore _db = FirebaseFirestore.instance;
Stream<List<Check>> getChecks() {
var ref = _db.collection(
"/users/.../.../checks/");
return ref.snapshots().map((list) => list.docs.map((doc) {
Map _a = doc.data() as Map<dynamic, dynamic>;
var _alternatives = _a['rollAlternatives']['default'];
List _s = _alternatives['stats'];
List<Stat> SS = [];
_s.forEach((e) => getStat(e.parent.path, e.id).listen((Stat event) {
SS.add(event);
}));
return Check.fromFirestore(doc, statList: SS);
}).toList());
Stream<Stat> getStat(String parentPath, String docId) {
return _db
.collection(parentPath)
.doc(docId)
.get()
.asStream()
.map((doc) => Stat.fromFirestore(doc));
}
你可以看到我有两个建设者一个Stat.fromFirestore和一个Check.fromFirestore
class Stat {
...
Stat(this.name, this.value);
...
factory Stat.fromFirestore(DocumentSnapshot doc) {
Map data = doc.data() as Map<dynamic, dynamic>;
return Stat(
data['name'],
data['value'],
);
}
}
因此,getChecks 方法在尝试创建新的 Check 对象实例之前消耗了 getStat 和 Stat。但目前它创建了Check 对象,Stat 的流尚未完成。因此,我的小部件仅使用 modifiers 字段中的常量值绘制。直到我更改屏幕,我才看到使用 stats 字段的结果呈现的小部件,所以它可以工作,但它没有“按时”呈现
有什么好的方法可以解决这个问题吗?我可以将getStat 变成未来,但我无法获得流式传输的数据,这是我需要的。
也许有一种方法可以等待流解决然后返回getChecks的结果我尝试使用listen的onDone参数,但它的类型签名为void。
提前谢谢你
【问题讨论】:
标签: firebase flutter dart google-cloud-firestore flutter-provider