【发布时间】:2019-12-31 11:10:44
【问题描述】:
如何真正覆盖 Flutter ListView 的滚动物理特性?
在我的具体用例中,我想覆盖 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 速度和距离设置为无穷大并使用欠阻尼弹簧来减慢弹道滚动动画来禁用投掷。
像这样使用它:
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),
),
),
这完全没有结果,然后我找到了this,所以我补充说:
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 方法,但仍然没有运气。我想知道,如何在颤动中真正覆盖列表视图的滚动物理?应该实现一个子类吗?我必须以不同的方式使用 applyTo 方法吗?是否没有简单的方法来覆盖弹簧/甩动行为并且我几乎坚持给定的类?
【问题讨论】: