【问题标题】:Streambuilder is not updating in FlutterStreambuilder 没有在 Flutter 中更新
【发布时间】:2021-09-27 15:17:43
【问题描述】:

我正在使用 Streambuilder 并从 firebase 加载快照。加载快照后,我将数据放入创建小部件结构的 Post.dart 中。我的代码可以获取数据,但是当我从火力库中删除帖子时,它仍然显示相同的帖子,但最后一个消失而不是删除的帖子。但是,如果我更改页面并返回,正确的页面将被删除,一切都很好。所以我认为flutter知道我正在改变我的firebase,但不知道如何将它映射到我的帖子中。有什么想法吗?

 StreamBuilder(
              stream: FirebaseFirestore.instance
                      .collection("timeline")
                      .doc(widget.currentUser.id)
                      .collection('timelinePosts')
                      .orderBy('timestamp', descending: true)
                      .snapshots()
              builder: (BuildContext context,
                  AsyncSnapshot<QuerySnapshot> streamSnapshot) {
                var items = streamSnapshot.data != null &&
                        streamSnapshot.data.docs != null
                    ? streamSnapshot.data.docs
                    : [];

                List<Post> posts =
                    items.map((doc) => Post.fromDocument(doc)).toList();

                return !streamSnapshot.hasData ||
                        streamSnapshot.connectionState ==
                            ConnectionState.waiting
                    ? Center(
                        child: CircularProgressIndicator(),
                      )
                    : Column(
                        children: posts);
              })

Post 类似于

 @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
      ...
      ],
    );
  }

【问题讨论】:

  • 永远不要在“stream:”调用中编写流。
  • @RandalSchwartz 为什么?如果是问题,我怎样才能让它变得更好?

标签: firebase flutter google-cloud-firestore stream-builder


【解决方案1】:

您需要为您的帖子项目小部件提供唯一键,以便在颤振重建该列时,它能够区分旧帖子和新帖子列表。基本上它与颤振如何决定重建某些元素以及何时重建有关。

如果你想测试一个唯一的键是否可以解决问题,我通常从给帖子小部件分配一个这样的键开始:

key: Key("${Random().nextDouble()}"),

看看这是否会改变什么。如果它修复它,您可以尝试更有效的键,例如每个元素的属性的组合。

【讨论】:

    【解决方案2】:

    我放弃 2 美分可能有点晚了,但您可以尝试将此代码添加到您的帖子小部件:

    @override
    void didUpdateWidget(Post oldWidget) {
     //add the code you want it to update inside your Post widget.
     super.didUpdateWidget(oldWidget);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 2021-02-07
      • 2019-08-19
      • 2022-11-17
      • 2019-10-09
      相关资源
      最近更新 更多