Flatter firebase快照为空时始终返回1个文档 StreamBuilder( 流:workoutsViewModel.ListenMyWorkoutChange(), 生成器:(上下文,异步快照){ if(snapshot.hasData){ 最终的workoutList=snapshot.data.documentChanges.map((doc)=>WorkoutModel.fromMap(doc.document.data,doc.document.documentID)).toList(); 打印(“--workouts”+workoutList.length.toString()); 工作列表。forEach((c){ 打印(“------------变更文件”+c.标题); });
我有这个代码,我可以听我的快照,我可以删除收藏中的任何文档Flatter firebase快照为空时始终返回1个文档 StreamBuilder( 流:workoutsViewModel.ListenMyWorkoutChange(), 生成器:(上下文,异步快照){ if(snapshot.hasData){ 最终的workoutList=snapshot.data.documentChanges.map((doc)=>WorkoutModel.fromMap(doc.document.data,doc.document.documentID)).toList(); 打印(“--workouts”+workoutList.length.toString()); 工作列表。forEach((c){ 打印(“------------变更文件”+c.标题); });,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,我有这个代码,我可以听我的快照,我可以删除收藏中的任何文档 如果我有4项,删除1项,则返回3项(文档或文档更改) 如果我有3项,删除1项,则返回2项(文档或文档更改) 如果我有2项,删除1项,则返回1项(文档或文档更改) 如果我只有1项,并且删除了1项,则返回1项(相同)(文档或文档更改)不为空 但是,如果我重新运行应用程序,它将工作,并且它将是空的 有人能帮忙吗 解决方案 这只是一个理论,因为我们没有完整的代码和数据库结构,但是根据这个方法,documentChanges应该返回一个Doc
- 如果我有4项,删除1项,则返回3项(文档或文档更改)
- 如果我有3项,删除1项,则返回2项(文档或文档更改)
- 如果我有2项,删除1项,则返回1项(文档或文档更改)
- 如果我只有1项,并且删除了1项,则返回1项(相同)(文档或文档更改)不为空
这只是一个理论,因为我们没有完整的代码和数据库结构,但是根据这个方法,
documentChanges
应该返回一个DocumentChange
对象列表
因此,在我看来,当最后一个文档被删除时,它返回1个结果并不奇怪。在DocumentChange
类中,这似乎是正确的行为,您也有remove
对我来说更奇怪的是,当你只删除文档时,你会得到更多的结果。在这种情况下,应该只有你删除的那一个
如果您查看DocumentChange
中有oldIndex
和newIndex
属性,它们可能已被更改
如果我站在你的立场,我会记录所有DocumentChange
属性,并分析这种行为的原因
我希望它会有所帮助!因此我发现这是一个基本的firestore颤振错误,因此我现在关闭此问题。我想我发现了问题所在
StreamBuilder(
stream: workoutsViewModel.listenMyWorkoutsChange(),
builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasData) {
final workoutList = snapshot.data.documentChanges.map((doc) => WorkoutModel.fromMap(doc.document.data, doc.document.documentID)).toList();
print("-- workouts " + workoutList.length.toString());
workoutList.forEach((c) {
print("---------- changed document " + c.title);
});