当试图按下按钮时,我试图从Flutter中的AlertDialog内部的Firebase读取数据,然后进行更新。
我尝试使用StreamBuilder,但没有任何反应
new FlatButton(
child: const Text('+ Add'),
onPressed: () {
StreamBuilder(
stream: Firestore.instance.collection('users').document(user.uid).collection('Filtre').document('ChooseSelf').snapshots(),
builder: (context, snapshot) {
var TypeSelfFilters = snapshot.data;
List<String> ListOfTypeSelf = List.from(TypeSelfFilters["Personer"]);
ListOfTypeSelf.add("value of TextFormField");
Firestore.instance.collection('users').document(user.uid).collection('Filtre').document('ChooseSelf').updateData({'Personer': ListOfTypeSelf});
}
);
Navigator.pop(context);
}
);
我没有收到任何错误,但是由于某些原因,StreamBuilder中的代码未执行。
谢谢
答案 0 :(得分:1)
嗯...在我看来,您希望在用户点击FlatButton
时获得数据。
让我们看看会发生什么:
StreamBuilder
navigator.pop()
问题:您在实例化navigator.pop()
之后立即致电StreamBuilder
。 StreamBuilder必须稍等一下才能获取数据。如果弹出路线,并且该路线破坏了警报对话框,则不会调用构建器回调。因此,实际发生的事情的顺序是:Tap -> Instantiate StreamBuilder -> pop route
建议:为什么要将计算结果包装在StreamBuilder中?您可以这样做:
onPressed: () {
Firestore.instance.collection('users')/*...*/.snapshots().then((snapshot) async {
// then branch is executed once snapshot is retrieved from firestore
var TypeSelfFilters = snapshot.data;
// do some more computation and magic
await Firestore.instance.collection/*...*/.updateData();
// wait for updateData to finish
Navigator.pop(context); // this context is not the context inside the StreamBuilder
});
}
答案 1 :(得分:0)
感谢DanielV。我找到了解决方案:
var myData = Firestore.instance.collection('users').document(user.uid).collection('Filtre').document('ChooseSelf').snapshots().first;
myData.then((snapshot) async {
var TypeSelfFilters = snapshot.data;
List<String> ListOfTypeSelf = List.from(TypeSelfFilters["Personer"]);
ListOfTypeSelf.add("bare en test");
Firestore.instance.collection('users').document(user.uid).collection('Filtre').document('ChooseSelf').updateData({'Personer': ListOfTypeSelf});
Navigator.pop(context); // this context is not the context inside the StreamBuilder
});
}
)