有没有一种方法可以明确告知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(); } } } } ); } )
回复磁贴是一个小部件,用于显示数据并检查其是否有子级以及是否递归。
每当顶级父答复图块离开视口时,它都会按预期方式放置,但是当尝试使其返回视图时,它将右滚动到顶部并看起来非常跳跃,甚至在尝试使用更大的线程(有多个子代)时更糟回到视图中,它根本不会滚动。
我认为如果列表视图知道高度,滚动问题就会消失,但是我可能错了
更糟糕的情况是如何使它不暴露,并且从一开始就加载整个线程?
当用户滚动列表并使用这些异步加载的结果设置列表项的高度时,您正在执行异步加载。这会导致在重建旧项目时出现滚动问题,因为旧项目的高度在创建时尚不可用。
您可以尝试将整个线程加载到Map中,并使用Regular来构建窗口小部件ListView。这样,所有数据都存在于内存中,供您在需要时读取。滚动查看新内容(无进度指示器)时,这会带来更好的用户体验,但是当数据更改时,您将不会获得更新,并且对于超长线程,可能会用光内存。请记住,FirebaseAnimatedList无论如何,它都会在内存中维护初始查询的完整结果列表,例如其他平台上的Firebase数据库UI。
ListView
FirebaseAnimatedList
如果您不喜欢该选项,则可以将完整的快照缓存在可以从中读取的地图中,这样在回滚到旧图块时就永远不会显示加载指示符。如果不实现某种驱逐逻辑,您仍然可能会用完内存,但是在实践中不太可能发生这种情况。
目前还没有分页FirebaseAnimatedList的方法,但是我一直在考虑添加它。