Flutter 如何防止使用“重新生成多个条子列表”;“无限”;项目?

Flutter 如何防止使用“重新生成多个条子列表”;“无限”;项目?,flutter,Flutter,首先,我想说,这与我使用集团模式时讨论的内容无关 我有一个小部件,其中我创建了一个CustomListView,其中包含多个基于StreamBuilder在CustomListView顶部返回的项目的SliverList。每个SliverList都是无限的,因为childCount设置为null。这是为了延迟加载目的。问题是,当我推到页面并从页面中弹出时,所有SliverLists的所有项目都会重新生成,这会导致延迟,尤其是当我已经在列表中排名靠后相当远的时候 我想这也许可以用钥匙来解决,但这似

首先,我想说,这与我使用集团模式时讨论的内容无关

我有一个小部件,其中我创建了一个CustomListView,其中包含多个基于StreamBuilder在CustomListView顶部返回的项目的SliverList。每个SliverList都是无限的,因为childCount设置为null。这是为了延迟加载目的。问题是,当我推到页面并从页面中弹出时,所有SliverLists的所有项目都会重新生成,这会导致延迟,尤其是当我已经在列表中排名靠后相当远的时候

我想这也许可以用钥匙来解决,但这似乎与此无关?我认为问题在于我在build方法中动态地重建SliverLists列表(请参见_ItemsBrowserState中的build()。我能想到的解决方案是将这些小部件存储在状态中,但这似乎只是在治疗症状而不是原因?关于使用AutomaticEpaLiveClientMixin,我也有同样的感受,但请随意改变我的想法

class ItemsBrowser扩展StatefulWidget{
最终回购集团回购集团;
ItemsBrowser({Key,required this.repoBloc}):super(Key:Key);
@凌驾
_ItemsBrowserState createState()=>\u ItemsBrowserState();
}
类_ItemsBrowserState扩展状态{
ScrollController\u ScrollController;
ItemBrowsersBloc集团;
列表组=[];
int atBloc=0;
bool\u batchLoadListener(滚动通知滚动通知){
如果(!(scrollNotification为ScrollUpdateNotification))返回false;
如果(_scrollController.position.extentAfter>500)返回false;
if(atBloc==blocs.length)返回false;
if(blocs[atBloc].isLoading.value)返回false;
if(blocs[atBloc].wasLastPage)atBloc++;
if(atBlocbloc.items.value.length)返回null;
//var itemIndex=(索引-1)%bloc.batchSize;
var itemIndex=指数-1;
var item=bloc.items.value[itemIndex];
回墨槽(
键:ValueKey(项目键),
子项:ItemTile(item),
onTap:(){
导航器.of(上下文).push(MaterialPageRoute(
生成器:(BuildContext上下文)=>ItemPage(item));
},
);
},childCount:isInitialLoad?0:null),
);
});
}
小部件_buildHeader(){
返回容器();
}
}
行为:我打开页面,看到第一个列表。在日志中,我看到“索引0”、“索引1”和“…”索引8'(请参阅ItemList中的build()),因为Flatter只懒洋洋地构建前9项。当我向下滚动时,会生成更多的项目。我停在“索引30”上,点击一个项目,这会推送一个新页面。现在的问题是:页面加载需要一秒钟的时间。日志显示“索引0”…'索引30',即所有项目都已重建,导致延迟。我弹出页面,再次重建0到30之间的所有项目,导致延迟

正如预期的那样,如果向下滚动到第二个SliverList,第一个SliverList的全部内容和第二个SliverList的延迟构建项都将被删除
slivers.add(ItemList(blocs[i], key: UniqueKey()));