有没有办法明确告诉firebase动画列表特定小部件的高度应该是多少?在我的例子中,firebase列表中的每个项目都有一个基于多个子项的可变大小(它是一个注释线程)。每当一个大线程出现在视口的上方(上方)时,它就会被丢弃并且高度被遗忘,这会在尝试向上滚动时导致恼人的阻塞和失败。
这是我的主题:
new FirebaseAnimatedList(
defaultChild: new DefaultThreadView(),
query: ref.child(postKey),
sort: (a, b) => (a.key.compareTo(b.key)),
itemBuilder: (context, DataSnapshot snapshot,
Animation<double> animation) {
return new FutureBuilder<DataSnapshot>(
future: ref.child(postKey).child(snapshot.key).once(),
builder: (BuildContext context,
AsyncSnapshot<DataSnapshot> snap) {
switch (snap.connectionState) {
case ConnectionState.none:
return new Center(
child: new CircularProgressIndicator());
case ConnectionState.waiting:
return new Center(
child: new CircularProgressIndicator());
default:
if (!snap.hasData) {
return new Text('Error: ${snap.error}');
}
else {
//check if this snap is a root node
String parent = snap.data.value['parent'];
if (parent == this.postKey) {
return new replyTile.ReplyTile(
snap.data, animation, this.postKey, 0);
} else {
return new Container();
}
}
}
}
);
}
)
回复磁贴是一个小部件,用于显示数据并检查它是否有任何子级,如果是,则进行递归。
每当顶级父回复图块离开视口时,它会按预期处理,但在尝试将其重新显示到视图中时,它会向右滚动到顶部并且看起来非常跳跃,每当更大的线程(具有多个子项)时更糟糕试图重新审视它根本不滚动。
我认为如果列表视图知道滚动问题的高度会消失,但我可能是错的
更糟糕的情况我如何制作它以便不暴露小部件并从一开始就加载整个线程?
答案 0 :(得分:4)
当用户滚动列表并使用这些异步加载的结果来设置列表项的高度时,您正在进行异步加载。这会在重建旧物品时导致滚动问题,因为它们的高度在构建时不可用。
您可以尝试将整个线程加载到Map中,并使用常规ListView
构建您的小部件。这样,所有数据都存储在内存中,供您在需要时阅读。当滚动查看新内容(没有进度指示器)时,这将带来更好的用户体验,但是当数据发生更改时您将无法获得更新,并且您可能因为特别长的线程而耗尽内存。请注意,FirebaseAnimatedList
维护内存中初始查询的完整结果列表,例如其他平台上的Firebase数据库用户界面。
如果您不喜欢该选项,则可以将已完成的快照缓存在可以读取的地图中,以便在滚动回旧图块时永远不会显示加载指示符。如果你没有实施某种驱逐逻辑,但你在实践中不太可能发生这种情况,你仍然可能会耗尽内存。
目前还没有对FirebaseAnimatedList进行分页的方法,但我一直在考虑添加它。