在 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 进行分页,但我一直在考虑添加它。