一尘不染

在Firebase动画列表中,有没有办法让Firebase列表知道小部件在加载之前的预期高度?

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();
                      }
                    }
                }
              }
          );
        }

    )

回复磁贴是一个小部件,用于显示数据并检查其是否有子级以及是否递归。

每当顶级父答复图块离开视口时,它都会按预期方式放置,但是当尝试使其返回视图时,它将右滚动到顶部并看起来非常跳跃,甚至在尝试使用更大的线程(有多个子代)时更糟回到视图中,它根本不会滚动。

我认为如果列表视图知道高度,滚动问题就会消失,但是我可能错了

更糟糕的情况是如何使它不暴露,并且从一开始就加载整个线程?


阅读 258

收藏
2020-08-13

共1个答案

一尘不染

当用户滚动列表并使用这些异步加载的结果设置列表项的高度时,您正在执行异步加载。这会导致在重建旧项目时出现滚动问题,因为旧项目的高度在创建时尚不可用。

您可以尝试将整个线程加载到Map中,并使用Regular来构建窗口小部件ListView。这样,所有数据都存在于内存中,供您在需要时读取。滚动查看新内容(无进度指示器)时,这会带来更好的用户体验,但是当数据更改时,您将不会获得更新,并且对于超长线程,可能会用光内存。请记住,FirebaseAnimatedList无论如何,它都会在内存中维护初始查询的完整结果列表,例如其他平台上的Firebase数据库UI。

如果您不喜欢该选项,则可以将完整的快照缓存在可以从中读取的地图中,这样在回滚到旧图块时就永远不会显示加载指示符。如果不实现某种驱逐逻辑,您仍然可能会用完内存,但是在实践中不太可能发生这种情况。

目前还没有分页FirebaseAnimatedList的方法,但是我一直在考虑添加它。

2020-08-13