我正在尝试使用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吗?先谢谢你了!
1条答案
按热度按时间hof1towb1#
使用Stream从Firestore获取数据似乎没有任何问题。这里的问题看起来像是您希望存储/保留List项的值,即使在更改Class时也是如此。更改列表项可以按预期工作,但恢复滑块似乎会恢复其先前状态的值。
这里的一个解决方法是在每次更改Class时重置Slider值,或者将Slider值存储在List或Firestore中的缓存中。但是看起来这些值已经被保存到Firestore中了。在覆盖数据之前,请务必检查要显示的现有值。