Flutter:StreamBuilder使用旧流而不是新流

dy1byipe  于 2023-05-18  发布在  Flutter
关注(0)|答案(1)|浏览(163)

我正在尝试使用Flutter的StreamBuilder在我的Flutter应用程序上显示Google-Firestore实时列表。
但是,流似乎同时使用了旧数据和新数据,而不仅仅是新数据。(见下文)

//This is the widget with the stream 
Expanded(
  child: StreamBuilder<QuerySnapshot>(
    stream: _firestoreInstance.collection("seeks").document('145725').collection("classes").document(_chosenClass)
                  .collection("classTopics").document(date).collection("dateTopics").snapshots(),
      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot){
        if (!snapshot.hasData) return Text('Loading...');
          return ListView(
            children: snapshot.data.documents.map((DocumentSnapshot document){
              debugPrint("DOCCUMENT ID: ${document.documentID} AND topic Name ${document['topicName']}");
              return ListTile(
                title: Text(document['topicName']),
                subtitle: TopicSlider(_chosenClass, document.documentID), //pass class name and topic id to slider to save in firebase
              );
            }).toList(),
          );
        },
      ),
    )

我选择CS 115和日期,让我得到正确的列表x1c 0d1x
文档ID也是正确的(debugPrint的输出):

不过,我一把课改到CS331

这种情况时有发生



可以看到,CS331的前三个文档ID与CS 115的ID完全相同。看起来好像流只是使用了在使用新数据之前存在的任何数据。我不明白为什么会这样,因为每次dropDownItem被更改时我都会调用setState--这样整个小部件就可以重建(从而用更新的数据重新生成一个新的流对象)。这会导致新UI使用旧数据的值。我在这个问题上已经纠结了好几天了,但似乎什么也解决不了。有人知道如何解决这个奇怪的bug吗?先谢谢你了!

hof1towb

hof1towb1#

使用Stream从Firestore获取数据似乎没有任何问题。这里的问题看起来像是您希望存储/保留List项的值,即使在更改Class时也是如此。更改列表项可以按预期工作,但恢复滑块似乎会恢复其先前状态的值。
这里的一个解决方法是在每次更改Class时重置Slider值,或者将Slider值存储在List或Firestore中的缓存中。但是看起来这些值已经被保存到Firestore中了。在覆盖数据之前,请务必检查要显示的现有值。

相关问题