【问题标题】:Flutter - How to override scroll physicsFlutter - 如何覆盖滚动物理
【发布时间】: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 方法吗?是否没有简单的方法来覆盖弹簧/甩动行为并且我几乎坚持给定的类?

【问题讨论】:

    标签: listview flutter scroll


    【解决方案1】:

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

    对于自定义滚动物理来说,覆盖它的构造和应用方式似乎是必不可少的,以便在ListViews 中使用,例如ListWheelScrollView。为此,必须实现一个带有parent 参数的构造函数并调用基类ScrollPhysicssuper(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 的实现方式,它看起来像是做这种事情的隐含方式。找不到任何关于此的文档,也不知道这是否是“正确”的方式。

    【讨论】:

      猜你喜欢
      • 2023-02-15
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2019-10-10
      • 1970-01-01
      • 2017-04-07
      相关资源
      最近更新 更多