Flutter - 如何覆盖滚动物理效果

5

如何在Flutter中实际覆盖滚动物理效应?

在我的具体用例中,我想覆盖ListWheelScrollView的滚动物理效应,以便在释放手势后模拟滚动仅以最大速度进行,同时禁用“过快”的飞速滚动。

我尝试了以下方法:

创建一个自定义的滚动物理类:

class CustomScrollPhysics extends FixedExtentScrollPhysics {
  @override
  double get minFlingVelocity => double.infinity;

  @override
  double get maxFlingVelocity => double.infinity;

  @override
  double get minFlingDistance => double.infinity;

  @override
  SpringDescription get spring => SpringDescription.withDampingRatio(ratio: 0.7);

}

我的想法是通过将fling的速度和距离设为无限大,并使用一个欠阻尼弹簧来减慢弹道滚动动画,从而禁用fling。

实现方法如下:

ListWheelScrollView.useDelegate(
              physics: CustomScrollPhysics(),
              clipToSize: true,
              useMagnifier: false,
              controller: scrollController,
              itemExtent: widget.itemExtent,
              childDelegate: ListWheelChildBuilderDelegate(
                builder: (context, toBuild) =>
                    toBuild < widget.min || toBuild > widget.max
                        ? null
                        : buildNumberWidget(context, toBuild),
              ),
            ),

这并没有做到任何事情,然后我找到了这个链接,所以我添加了:

class CustomScrollPhysics extends FixedExtentScrollPhysics {
  //....
  @override
  FixedExtentScrollPhysics applyTo(ScrollPhysics ancestor) {
    return CustomScrollPhysics();
  }
}

这样做确实达到了某种效果,但是却破坏了列表视图,具体来说,现在它会在两端溢出并在拖动后引发异常:
 Another exception was thrown: 'package:flutter/src/widgets/scrollable.dart': Failed assertion: line 480 pos 12: '_drag == null': is not true.

这种行为也与其他更改无关,它们仍然不能真正做任何事情。因此,这显然与滚动物理如何组合有关,所以我尝试使用FixedExtentScrollPhysics和ScrollPhysics的applyTo方法,但仍没有运气。我想知道,如何在Flutter中覆盖列表视图的滚动物理?是否应该实现子类?我必须以不同的方式使用applyTo方法吗?是否没有简单的方法覆盖弹簧/抛掷行为,而我基本上被给定的类卡住了?
1个回答

8

所以,我找到了一个可行的解决方案。

看起来对于自定义滚动物理效果,重写其构造和应用方法非常必要,这样才能在ListView中使用,例如ListWheelScrollView。为此,需要实现一个带有parent参数的构造函数,并调用ScrollPhysics基类的super(parent: parent)。然后,需要重写applyTo方法,以返回一个自定义滚动物理效果类的实例,并将ancestor参数封装在buildParent(ancestor)中作为构造函数的parent参数。然后它就可以正确地应用了。因此,以下是禁用了快速滑动效果的FixedExtentScrollPhysics的示例:

class CustomScrollPhysics extends FixedExtentScrollPhysics {
  const CustomScrollPhysics({ScrollPhysics parent})
      : super(parent: parent);

  @override
  double get minFlingVelocity => double.infinity;

  @override
  double get maxFlingVelocity => double.infinity;

  @override
  double get minFlingDistance => double.infinity;

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

由于每个ScrollPosition都是这样实现的,所以看起来这就是执行此类操作的隐含方式。找不到任何关于此的文档,并且不太清楚这是否是“正确”的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接