如何从AlertDialog小部件中的Firebase读取数据?

时间:2019-06-02 09:14:32

标签: firebase flutter dart google-cloud-firestore

当试图按下按钮时,我试图从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中的代码未执行。

谢谢

2 个答案:

答案 0 :(得分:1)

嗯...在我看来,您希望在用户点击FlatButton时获得数据。

让我们看看会发生什么:

  1. 点击FlatButton
  2. 实例化StreamBuilder
  3. 开始从Firestore获取数据
  4. 做一些Firestore魔术,更新日期
  5. 然后通过navigator.pop()
  6. 关闭对话框

问题:您在实例化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
                });
                }
                )