如何在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方法吗?是否没有简单的方法覆盖弹簧/抛掷行为,而我基本上被给定的类卡住了?