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。填充列表项目
startAt()
,但这是切向的。)项目的顶部
.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;
}
});
//如果我们收到的比我们试图装载的少,那么我们已经到达了终点。
如果(计算)