对于一个颤动的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);
}
我在这里的目的是通过将“弹跳”速度和距离设置为无穷大并使用阻尼不足的弹簧来减慢弹道滚动动画来禁用弹跳。
像这样使用它:
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方法?有没有简单的方法可以覆盖spring / fling的行为,并且在给定的类中存在很多问题?
答案 0 :(得分:0)
因此,我找到了一个可行的解决方案。
对于自定义滚动物理来说,似乎很重要,它可以覆盖其构造和应用方式,以在ListView
等ListWheelScrollView
中使用。为此,必须实现一个带有parent
参数的构造函数,并调用基super(parent:parent)
类的ScrollPhysics
。然后,必须重写applyTo
方法,以返回一个自定义滚动物理类的实例,该实例的ancestor
参数包装在buildParent(ancestor)
中,作为构造方法的parent
参数。然后,它实际上可以正确应用。因此,{@ {1}}的禁止翻转的示例是:
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));
}
}
的实现方式,因此这似乎是执行此操作的隐含方式。找不到任何文档,也不知道这是否是“正确”的方法。