我尝试在flutter中从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中的代码由于某种原因没有被执行。
谢谢您

最佳答案

Hm.…在我看来,当用户点击FlatButton时,您希望获得数据。
让我们看看会发生什么:
点击扁平按钮
实例化aStreamBuilder
开始从FireStore获取数据
做一些火商店魔术,更新日期
然后关闭对话框
问题:在实例化navigator.pop()后立即调用navigator.pop()。streambuilder必须等待一段时间才能获取数据。如果弹出一条路由,并破坏警报对话框,则不会调用生成器回调。所以事情发生的实际顺序是:StreamBuilder
建议:为什么要将计算包装在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
  });
}

关于firebase - 如何从AlertDialog小部件中的firebase读取数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56413702/

10-12 01:38