在 firebase 动画列表中,有没有办法让 firebase 列表在加载之前知道小部件的预期高度?
In a firebase animated list, is there a way to let firebase list know the expected height of a widget before it loads?
有没有办法明确告诉 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();
}
}
}
}
);
}
)
回复磁贴是一个小部件,用于显示数据并检查它是否有任何子项,如果有则递归。
每当顶部的父回复磁贴离开视口时,它就会按预期处理,但当试图将其带回视图时,它会向右滚动到顶部并且看起来非常跳跃,更糟糕的是当一个更大的线程(有多个children) 试图回到视图中它根本不滚动。
我认为如果列表视图知道高度,滚动问题就会消失,但我可能错了
更糟糕的情况下,我该如何做到不暴露小部件并从一开始就加载整个线程?
您在用户滚动列表时进行异步加载,并使用这些异步加载的结果来设置列表项的高度。这会导致重建旧项目时出现滚动问题,因为它们的高度在构建时不可用。
您可以尝试将整个线程加载到 Map 中并使用常规 ListView
构建您的小部件。这样所有数据都在内存中,供您在需要时读取。这会在滚动查看新内容(无进度指示器)时带来更好的用户体验,但是当数据更改时您不会获得更新,并且您可能 运行 内存不足以处理特别长的线程。请记住,FirebaseAnimatedList
无论如何都会在内存中维护初始查询的完整结果列表,就像其他平台上的 Firebase 数据库 UI。
如果您不喜欢该选项,您可以将完成的快照缓存在您可以读取的地图中,这样当滚动回旧图块时永远不会显示加载指示器。如果您不实施某种逐出逻辑,您仍然可能 运行 内存不足,但在实践中不太可能发生。
目前还没有办法对 FirebaseAnimatedList 进行分页,但我一直在考虑添加它。
有没有办法明确告诉 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();
}
}
}
}
);
}
)
回复磁贴是一个小部件,用于显示数据并检查它是否有任何子项,如果有则递归。
每当顶部的父回复磁贴离开视口时,它就会按预期处理,但当试图将其带回视图时,它会向右滚动到顶部并且看起来非常跳跃,更糟糕的是当一个更大的线程(有多个children) 试图回到视图中它根本不滚动。
我认为如果列表视图知道高度,滚动问题就会消失,但我可能错了
更糟糕的情况下,我该如何做到不暴露小部件并从一开始就加载整个线程?
您在用户滚动列表时进行异步加载,并使用这些异步加载的结果来设置列表项的高度。这会导致重建旧项目时出现滚动问题,因为它们的高度在构建时不可用。
您可以尝试将整个线程加载到 Map 中并使用常规 ListView
构建您的小部件。这样所有数据都在内存中,供您在需要时读取。这会在滚动查看新内容(无进度指示器)时带来更好的用户体验,但是当数据更改时您不会获得更新,并且您可能 运行 内存不足以处理特别长的线程。请记住,FirebaseAnimatedList
无论如何都会在内存中维护初始查询的完整结果列表,就像其他平台上的 Firebase 数据库 UI。
如果您不喜欢该选项,您可以将完成的快照缓存在您可以读取的地图中,这样当滚动回旧图块时永远不会显示加载指示器。如果您不实施某种逐出逻辑,您仍然可能 运行 内存不足,但在实践中不太可能发生。
目前还没有办法对 FirebaseAnimatedList 进行分页,但我一直在考虑添加它。