Dart 在Firebase中,如何处理静态加载最新的N之后添加的新子级?

Dart 在Firebase中,如何处理静态加载最新的N之后添加的新子级?,dart,firebase,Dart,Firebase,以下是我的分页/无限滚动场景: 使用startAt().limit(N).once('value')加载初始N。填充列表项目 在滚动时,加载下一个N。(我将优先级传递给startAt(),但这是切向的。) 添加新项目时,我希望将其弹出到项目的顶部 如果我在步骤3中使用.onchildaded侦听器,它会查找所有项目,包括我已经拉入的项目,从而创建重复项。有更好的办法吗 另一种方法是在步骤1中使用.onchildaded监听器作为初始N,而不是.once,但当初始N项出现时,我会执行项。添加(项)

以下是我的分页/无限滚动场景:

  • 使用
    startAt().limit(N).once('value')
    加载初始N。填充列表
    项目
  • 在滚动时,加载下一个N。(我将优先级传递给
    startAt()
    ,但这是切向的。)
  • 添加新项目时,我希望将其弹出到
    项目的顶部
  • 如果我在步骤3中使用
    .onchildaded
    侦听器,它会查找所有项目,包括我已经拉入的项目,从而创建重复项。有更好的办法吗


    另一种方法是在步骤1中使用
    .onchildaded
    监听器作为初始N,而不是
    .once
    ,但当初始N项出现时,我会执行
    项。添加(项)
    以按顺序依次排序,但对于在事实之后出现的新项目,我需要知道它的独特性,以便我可以执行
    项。插入(0,项)
    以强制它位于列表的顶部。我不知道如何设置,或者我是否偏离了这里的标准。

    编辑:仍在变化中,请参阅:

    我想出了一个可行的解决方案:

    类FeedViewModel扩展了可观察{
    int pageSize=20;
    @可观察bool重载内容=false;
    @可观测布尔到达端=假;
    var snapshotPriority=null;
    bool isFirstRun=true;
    FeedViewModel(this.app){
    loadItemsByPage();
    }
    /**
    *一次按页面大小加载更多项目。
    */
    loadItemsByPage(){
    重新加载内容=真;
    var itemsRef=f.child('/items_by_community/'+app.community.alias)
    .startAt(优先级:(snapshotPriority==null)?null:snapshotPriority.limit(页面大小+1);
    整数计数=0;
    //获取项目列表,并侦听新项目。
    itemsRef.one('value')。然后((快照){
    snapshot.forEach((itemSnapshot){
    计数++;
    //不要处理我们在上面的limit()中附加在pageSize上的额外项目。
    打印(“计数:$count,页面大小:$pageSize”);
    //跟踪快照的优先级,以便从上一个快照分页。
    snapshotPriority=itemSnapshot.getPriority();
    如果(计数>页面大小)返回;
    //将每个新项目插入列表。
    //TODO:这看起来很奇怪。我这样做是为了能够分离出添加到列表中的方法。
    添加(toObservable(processItem(itemSnapshot));
    //如果这是加载的第一个项目,则开始侦听新项目。
    //通过使用项目的优先级,我们只能侦听较新的项目。
    如果(isFirstRun==true){
    listenForNewItems(快照优先级);
    isFirstRun=false;
    }
    });
    //如果我们收到的比我们试图装载的少,那么我们已经到达了终点。
    如果(计算)