如何为Firebase分页动态设置快照限制

如何为Firebase分页动态设置快照限制,firebase,react-native,google-cloud-firestore,pagination,react-native-flatlist,Firebase,React Native,Google Cloud Firestore,Pagination,React Native Flatlist,我尝试构建一个平面列表,它从使用分页的Firebase接收图像。 图像按时间戳降序排序,以便最新图像显示在顶部 this.imageSubscribtion = await this.ref .orderBy('timestamp', 'desc') .limit(this.state.limit) .onSnapshot(async querySnapshot => { let imagesProm = querySnapshot.docs.map(async doc

我尝试构建一个平面列表,它从使用分页的Firebase接收图像。 图像按时间戳降序排序,以便最新图像显示在顶部

this.imageSubscribtion = await this.ref
  .orderBy('timestamp', 'desc')
  .limit(this.state.limit)
  .onSnapshot(async querySnapshot => {
    let imagesProm = querySnapshot.docs.map(async doc => {
    
      let data = await doc.data()

      return {
       ...data
      };
    });

    let images = await Promise.all(imagesProm);
    this.setState(
      {
        pointer: querySnapshot.docs[querySnapshot.docs.length - 1],
        images: images, //.reverse(),
        isLoading: false,
      }
    );
  });
如果用户到达列表的末尾,它将再加载30个项目

if (this.state.pointer) {
  this.setState({refreshing: true}, async () => {
    let result = await this.ref
      .orderBy('timestamp', 'desc')
      .limit(30)
      .startAfter(this.state.pointer)
      .get();

    let imageRefs = result.docs.map(async doc => {
      let data = await doc.data()
      return {
        ...data
      };
    });
    let images = await Promise.all(imageRefs);
    let newImages = this.state.images.concat(images);
    this.setState(
      {
        pointer: result.docs[result.docs.length - 1],
        images: newImages,
        refreshing: false,
        limit: newImages.length,
      });
  });
}
这非常好,所有新图像都添加正确

当上传新图像时,问题开始出现。当imageSubscribtion的onsnapshot方法被激发时,将加载新图像,但初始限制为30个项目

如果有人正在查看图像,并且低于30个图像,平面列表将重置为30个图像,他需要再次向下滚动


是否可以动态设置查询限制?我还尝试使用startAt(this.state.pointer)定义查询,但它不起作用,因为在第一次获取时指针仍然未定义。

要使用
startAt()
您需要更改执行第一次查询的方式,因此从一开始就有值,并避免
未定义的
。你能看一下这篇文章,看看它是否对你有帮助吗?它为Firestore的动态分页提供了一些见解。谢谢,我会看一看,稍后再回复。我尝试了它,并改变了方向,因为我的列表从上到下,从新到旧。但如果新图像被删除或修改,它将无法正常工作。实际上,我从一开始的意思不是颠倒数据的顺序,而是在调用
startAt()
时将查询配置为已经有值。你试过了吗?