Flutter Flatter Firestore分页(添加/删除项目)

Flutter Flatter Firestore分页(添加/删除项目),flutter,google-cloud-firestore,pagination,mobx,Flutter,Google Cloud Firestore,Pagination,Mobx,我正在努力完成这件事,两天后我决定向你们寻求帮助。 我使用Mobx作为状态管理,问题与在列表中添加/删除项目有关,例如,如果我根据限制检索两个查询,每个查询5个项目,然后从第一个查询中删除一个项目,则第二个查询中的第一个项目是重复的,如果我添加新项目,则第二个查询中的第一个项目是隐藏的。我还为ListView.builder设置了一个scrollListener,以获取列表的底部并调用更多项 提前感谢, @override Stream<QuerySnapshot> teste(

我正在努力完成这件事,两天后我决定向你们寻求帮助。 我使用Mobx作为状态管理,问题与在列表中添加/删除项目有关,例如,如果我根据限制检索两个查询,每个查询5个项目,然后从第一个查询中删除一个项目,则第二个查询中的第一个项目是重复的,如果我添加新项目,则第二个查询中的第一个项目是隐藏的。我还为ListView.builder设置了一个scrollListener,以获取列表的底部并调用更多项

提前感谢,

@override
  Stream<QuerySnapshot> teste(DocumentSnapshot lastDoc) {
    if (lastDoc == null) {
      return firestore.collection('teste')
      .orderBy('name')
      .limit(5)
      .snapshots();
    } else {
      return firestore.collection('teste')
      .orderBy('name')
      .limit(5)
      .startAfterDocument(lastDoc)
      .snapshots();
    }
  }

  @observable
  ObservableList<List<TesteModel>> allPagedResults = ObservableList<List<TesteModel>>();

  @observable
  ObservableList<TesteModel> listTeste = ObservableList<TesteModel>();

  @observable
  DocumentSnapshot lastDoc;

  @observable
  bool hasMoreItem;

  @action
  void teste() {
    var _currentRequestIndex = allPagedResults.length;
    
    primaryRepository.teste(lastDoc).listen((query) {
      if (query.docs.isNotEmpty) {
        var _query = query.docs.map((doc) => TesteModel.fromFirestore(doc))
        .toList();

        var _pageExists = _currentRequestIndex < allPagedResults.length;

        if (_pageExists) allPagedResults[_currentRequestIndex] = _query;
        else allPagedResults.add(_query);

        listTeste = allPagedResults.fold<List<TesteModel>>(<TesteModel>[],
          (initialValue, pageItems) => initialValue..addAll(pageItems)).asObservable();

        if (_currentRequestIndex == allPagedResults.length - 1) lastDoc = query.docs.last;
        
        hasMoreItem = _query.length == 5;
      }
    });
  }
@覆盖
流测试(文档快照lastDoc){
如果(lastDoc==null){
返回firestore.collection('teste'))
.orderBy('名称')
.限额(5)
.快照();
}否则{
返回firestore.collection('teste'))
.orderBy('名称')
.限额(5)
.startAfterDocument(lastDoc)
.快照();
}
}
@可观察
ObservableList allPagedResults=ObservableList();
@可观察
ObservableList Teste=ObservableList();
@可观察
文档快照lastDoc;
@可观察
布尔·哈斯莫尔项目;
@行动
无效测试(){
var\u currentRequestIndex=allPagedResults.length;
teste(lastDoc).listen((查询){
if(query.docs.isNotEmpty){
var\u query=query.docs.map((doc)=>TesteModel.fromFirestore(doc))
.toList();
var_pageExists=_currentRequestIndexinitialValue..addAll(pageItems)).asObservable();
如果(_currentRequestIndex==allPagedResults.length-1)lastDoc=query.docs.last;
hasMoreItem=\u query.length==5;
}
});
}

这个问题运气好吗

要添加新项目并拥有多个页面,您可以执行以下操作:

if (allPagedResults.contains(allPagedResults[0].last) == false) {
   allPagedResults.last.add(allPagedResults[0].last);
   allPagedResults.last.remove(allPagedResults[0].first);
}

如果正在分页并显示两个“页面已满”的数据,则需要同时侦听两个流,或者侦听一个页面大小为两倍的流。否则,您确实会遇到重叠/间隙问题。但是第一页和第二页的侦听器中有一个保持活动状态,在您描述的这种情况下,它们都应该触发。如果您没有遇到这种情况,您能否以我们也可以看到的方式显示问题?例如,通过打印ID并在您的问题中包含代码和输出?您好,我已经添加了代码,输出只是一个列表,例如第一个查询/页面[1,2,3,4,5],当我检索第二个查询时,我将有[1,2,3,4,5,6,7,8,9,10]如果我从第一个查询/页面中删除一个项目,例如第一个项目,那么输出将是[2,3,4,5,6,6,7,8,9,10]。对不起,我不知道它是否清晰。。谢谢