Flutter-如何忽略滚动物理

时间:2019-08-27 09:40:23

标签: listview flutter scroll

对于一个颤动的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的行为,并且在给定的类中存在很多问题?

1 个答案:

答案 0 :(得分:0)

因此,我找到了一个可行的解决方案。

对于自定义滚动物理来说,似乎很重要,它可以覆盖其构造和应用方式,以在ListViewListWheelScrollView中使用。为此,必须实现一个带有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)); } } 的实现方式,因此这似乎是执行此操作的隐含方式。找不到任何文档,也不知道这是否是“正确”的方法。