【发布时间】:2019-01-03 07:51:03
【问题描述】:
我正在为我的应用创建新闻提要,当我向下滚动时,将从 Firestore 获取数据。一旦我向上滚动,列表视图就会立即捕捉到最顶部,从而跳过中间的所有其他项目。如果我用静态数据加载列表视图,它可以正常工作,但是当我从 Firestore 中提取数据时,问题再次出现。我不确定是什么导致了这种行为。
Video demonstrating the irregular scrolling behaviour
这是我的代码
return StreamBuilder(
stream: Firestore.instance.collection(Constants.NEWS_FEED_NODE)
.document("m9yyOjsPxV06BrxUtHdp").
collection(Constants.POSTS_NODE).orderBy("timestamp",descending: true).snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData)
return Center(child: CircularProgressIndicator(),);
if (snapshot.data.documents.length == 0)
return Container();
//after getting the post ids, we then make a call to FireStore again
//to retrieve the details of the individual posts
return ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (_, int index) {
return FeedItem2(feed: Feed.fireStore(
snapshot: snapshot.data.documents[index]),);
});
},
);
【问题讨论】:
-
你能把
return FeedItem2()换成return Container(padding: EdgeInsets.all(50.0), child: Text("test"));看看问题是否消失了吗?如果是这样,它可能指向FeedItem2小部件是问题,在这种情况下,我们需要查看该小部件的代码。我假设小部件正在做一些动态的事情 -
为了好玩,尝试将
cacheExtent: 10000.0传递给 ListView 工厂构造函数。如果我们在滚动浏览当前可见的内容时遇到 ListView 如何处理和重新初始化小部件的问题,这可能有助于我们隔离 -
也许确保 FeedItem2 始终保持相同的高度(在第一次渲染和任何后续渲染时,例如加载图像)。因为动态更改列表视图中元素的高度可能会导致一些屏幕外元素初始化,这反过来又会将它们推到足够远的位置以进行处理。我无法从视频中完全判断是否是这种情况. FWIW
-
对我来说,解决方案是结合 cacheExtent(任何合理的像素数)和 shrinkWrap: false
标签: firebase dart google-cloud-firestore flutter