繁体   English   中英

在 Flutter 中使用 ListView 或 CustomScrollView 在顶部添加新元素时如何保持滚动 position

[英]How to keep the scrolling position when adding a new elements in the top using ListView or CustomScrollView in Flutter

是否可以将新元素添加到 ListVeiw 或 CustomScrollView 的顶部并保持滚动 position 与 Flutter 一样

我试过以下

extentAfter = _scrollController.position.extentAfter;
_scrollController.jumpTo(_scrollController.position.maxScrollExtent - extentAfter);

但这不适用于 SliverAppBar - 浮动且实际上不是最佳解决方案。

实际上,最干净的方法是仅在用户滚动回 ListView 顶部时才添加这些项目。 您可以将它们缓存在 memory 中,因为用户距离列表顶部(在您的情况下)足够远。

添加physics: const AllwaysScrollableFixedPositionScrollPhysics(),到您的CustomScrollView

如果用户在列表的边缘,新项目会自动滚动到

import 'package:flutter/material.dart';

class AllwaysScrollableFixedPositionScrollPhysics extends ScrollPhysics {
  /// Creates scroll physics that always lets the user scroll.
  const AllwaysScrollableFixedPositionScrollPhysics({ScrollPhysics? parent})
      : super(parent: parent);

  @override
  AllwaysScrollableFixedPositionScrollPhysics applyTo(ScrollPhysics? ancestor) {
    return AllwaysScrollableFixedPositionScrollPhysics(parent: buildParent(ancestor));
  }

  @override
  double adjustPositionForNewDimensions({
    required ScrollMetrics oldPosition,
    required ScrollMetrics newPosition,
    required bool isScrolling,
    required double velocity,
  }) {
    if (newPosition.extentBefore == 0) {
      return super.adjustPositionForNewDimensions(
        oldPosition: oldPosition,
        newPosition: newPosition,
        isScrolling: isScrolling,
        velocity: velocity,
      );
    }
    return newPosition.maxScrollExtent - oldPosition.extentAfter;
  }

  @override
  bool shouldAcceptUserOffset(ScrollMetrics position) => true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM