Flutter:从子 StreamBuilder 更新有状态小部件

标签 flutter google-cloud-firestore

我写了一些简化的代码,我希望 firestore 数据的条件能够更新父小部件。

我收到错误:在构建期间调用了 setState() 或 markNeedsBuild()。

如何从 StreamBuilder 中更新 myVar 的状态?更新 myVar 后,将不会访问 StreamBuilder,而只会显示文本 Waiting...。

编辑:我更新了 myVar 以用作 Firestore 的文档 ID。澄清一下,我希望能够从 StreamBuilder 内部更新 StreamBuilder 的文档。换句话说,正如问题所说,从子 StreamBuilder 更新有状态小部件。

class MyWidget extends StatefulWidget {
  MyWidget({Key key})
      : super(key: key);

  @override
  _MyWidgetState createState() {
    return _MyWidgetState();
  }
}

class _MyWidgetState extends State<MyWidget> {
  String myVar = "someID";

  @override
  Widget build(BuildContext context) {
    if (myVar == null) {
      // update myVar async, so that StreamBuilder will be re-rendered
      asyncFunctUpdate(myVar); // edit: finally got it to work if doing setState from asyncFuncUpdate(myvar).then(()=>setState)
      return Text("Waiting...");
    }
    else
      return StreamBuilder<DocumentSnapshot>(
          stream: Firestore.instance
              .collection('myCollection')
              .document(myVar)
              .snapshots(),
          builder: (context, orderSnapshot) {
            if (!orderSnapshot.data.exists)
              setState(() {
                myVar = null;
              });
            else return Text(orderSnapshot);
          });
  }
}

解决方法: 在我的例子中,从 StreamBuilder 和 setState 返回按钮更简单,就像通常从 onPressed 函数返回一样。

解决方法: 不要从异步函数中执行 setState,而是在 .then 子句中执行它(参见上面的代码)

最佳答案

一般来说,您不必做现在正在做的事情。你可以做 return Text ("Waiting ...");马上不调用 setState。在您的情况下,这是一个更好的决定。您响应来自流的事件,并且必须根据当前状态返回内容

return StreamBuilder<DocumentSnapshot>(
      stream: Firestore.instance
          .collection('myCollection')
          .document('myDocument')
          .snapshots(),
      builder: (context, orderSnapshot) {
        if (!orderSnapshot.data.exists)
            return Text("Waiting...");
        else return Text(orderSnapshot);
      });

关于Flutter:从子 StreamBuilder 更新有状态小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58991747/

相关文章:

flutter - Flutter-如何在调用某个操作按钮时重新加载整个页面(再次以其初始化状态重新加载小部件)?

swift - Firestore 收集监听器大量读取

javascript - Firestore 子集合中文档的通配符查询

android - 找不到 com.android.tools.build :gradle:5. 1.1

flutter - Flutter 中是否有支持淡入淡出的插件

flutter - 如何使用 API flutter 覆盖 Google Drive 中的文件

android - flutter 未定义类 'FirebaseFirestore'

Flutter- GestureDetector 检测水平和垂直拖动的方向

google-cloud-firestore - 同一个 firestore 集合上的多个触发器

android - Firebase Firestore - 在 Android 上获取同步状态