RSp*_*ule 2 firebase firebase-realtime-database flutter
有没有办法明确告诉 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();
}
}
}
}
);
}
)
Run Code Online (Sandbox Code Playgroud)
回复图块是一个小部件,用于显示数据并检查它是否有任何子级,如果有则递归。
每当顶部父级回复图块离开视口时,它都会按预期进行处理,但是当尝试将其带回到视图中时,它会向右滚动到顶部并且看起来非常跳跃,每当更大的线程(具有多个子级)试图出现时,情况就更糟返回视图时它根本不滚动。
我认为如果列表视图知道高度,滚动问题就会消失,但我可能是错的
更糟糕的情况是如何使小部件不暴露并且整个线程从一开始就加载?
当用户滚动列表时,您正在执行异步加载,并使用这些异步加载的结果来设置列表项的高度。这会导致重建旧项目时出现滚动问题,因为它们的高度在构建时不可用。
您可以尝试将整个线程加载到 Map 中并使用常规ListView. 这样,所有数据都在内存中,供您在需要时读取。这将在滚动查看新内容(无进度指示器)时带来更好的用户体验,但当数据更改时您将无法获得更新,并且可能会因异常长的线程而耗尽内存。请记住,FirebaseAnimatedList无论如何,它都会在内存中维护初始查询的完整结果列表,就像其他平台上的 Firebase 数据库 UI 一样。
如果您不喜欢该选项,您可以将已完成的快照缓存在可以读取的地图中,这样当滚动回旧图块时就不会显示加载指示器。如果您不实现某种驱逐逻辑,您仍然可能会耗尽内存,但在实践中这种情况不太可能发生。
目前还没有办法对 FirebaseAnimatedList 进行分页,但我一直在考虑添加它。
| 归档时间: |
|
| 查看次数: |
4568 次 |
| 最近记录: |