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

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)

回复图块是一个小部件,用于显示数据并检查它是否有任何子级,如果有则递归。

每当顶部父级回复图块离开视口时,它都会按预期进行处理,但是当尝试将其带回到视图中时,它会向右滚动到顶部并且看起来非常跳跃,每当更大的线程(具有多个子级)试图出现时,情况就更糟返回视图时它根本不滚动。

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

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

Col*_*son 5

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

您可以尝试将整个线程加载到 Map 中并使用常规ListView. 这样,所有数据都在内存中,供您在需要时读取。这将在滚动查看新内容(无进度指示器)时带来更好的用户体验,但当数据更改时您将无法获得更新,并且可能会因异常长的线程而耗尽内存。请记住,FirebaseAnimatedList无论如何,它都会在内存中维护初始查询的完整结果列表,就像其他平台上的 Firebase 数据库 UI 一样。

如果您不喜欢该选项,您可以将已完成的快照缓存在可以读取的地图中,这样当滚动回旧图块时就不会显示加载指示器。如果您不实现某种驱逐逻辑,您仍然可能会耗尽内存,但在实践中这种情况不太可能发生。

目前还没有办法对 FirebaseAnimatedList 进行分页,但我一直在考虑添加它。