dart - 在 Flutter 中保持 ScrollView 偏移的同时添加 ListView 项

我正在寻找一种将新项目插入 ListView 的方法,同时保持用户的滚动偏移量。基本上就像拉刷新后的推特提要:新项目被添加到顶部,而滚动位置保持不变。然后,用户只需向上滚动即可查看新添加的项目。

如果我只是在开始时用几个新项目重建列表/滚动小部件,它当然会跳跃,因为滚​​动 View 内容的高度增加了。仅仅估计那些新项目的高度来纠正跳跃不是一种选择,因为新项目的内容是可变的。 即使是提供在任意位置动态插入项目的方法的 AnimatedList 小部件,在索引 0 处插入时也会跳转。

关于如何解决这个问题的任何想法?也许使用 Offstage 小部件预先计算新项目的高度?

最佳答案

最近遇到了这个问题:我有一个聊天滚动条,它根据滚动条的方向异步加载上一条或下一条消息。 This解决方案对我有用。
解决方案的思路如下。您创建两个 SliverList 并将它们放在 CustomScrollView 中。

CustomScrollView(
  center: centerKey,
  slivers: <Widget>[
    SliverList(
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
            return Container(
              // Here we render elements from the upper group
              child: top[index]
            )
        }
    ),
    SliverList(
      // Key parameter makes this list grow bottom
      key: centerKey,
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
            return Container(
              // Here we render elements from the bottom group
              child: bottom[index]
            )
        }
    ),
)

第一个列表向上滚动,而第二个列表向下滚动。它们的偏移零点固定在同一点,从不移动。如果您需要添加一个项目,请将其推送到顶部列表,否则,将其推送到底部列表。这样他们的偏移量就不会改变,你的 ScrollView 也不会跳跃。
您可以在以下 dartpad example 中找到解决方案原型(prototype).

UPD:修复了 dartpad example 中的 null 安全问题.

https://stackoverflow.com/questions/52180947/

相关文章:

dictionary - flutter/Dart : How to access a single

dart - Flutter 在 `flutter` 命令上失败

dart - 如何在 Flutter 中移除 AppBar 前导图标周围的额外填充

android-studio - Flutter Android Studio 构建失败

firebase - Firestore 事务失败,出现 "Transaction failed a

dart - 如何在 Flutter 中通过 Navigator 测试导航

android - 防止对话框在 Flutter 中关闭外部触摸

dart - 绘制带边框的圆形图像

flutter - 如何将焦点转移到 Flutter 中的下一个 TextField?

dart - flutter 圈设计