flutter 两级滚轮控制问题修复


标题可能不太清晰,具体的问题是:外层为一个 ListView,内层为一个可缩放的表格。当鼠标放在表格上控制滚轮,会同时触发列表滑动 + 表格缩放,印象用户体验。

解决这个问题需要两步。

1. 增加 MouseRegion

将表格嵌套进 MouseRegion 中,监听鼠标进入和退出表格。

      chart = MouseRegion(
          onEnter: (event) {
            backtextInputData.enableScroll = false;
          },
          onExit: (event) {
            backtextInputData.enableScroll = true;
          },
          child: // 原表格
    }

这里在鼠标进入和退出时,对 enableScroll 变量进行赋值。

2. 创建新的 ScrollPhysics 类

创建一个新的 ScrollPhysics 类 CustomScrollPhysics,以替换 ListView 自带的 ScrollPhysics。

class CustomScrollPhysics extends ScrollPhysics {
  /// Creates scroll physics that does not let the user scroll.
  const CustomScrollPhysics(this.data, {super.parent});

  final BacktestInputData data;

  @override
  CustomScrollPhysics applyTo(ScrollPhysics? ancestor) {
    return CustomScrollPhysics(data, parent: buildParent(ancestor));
  }

  @override
  bool get allowUserScrolling => data.enableScroll;

  @override
  bool get allowImplicitScrolling => data.enableScroll;
}

在 CustomScrollPhysics 中要做的是覆写 allowUserScrolling,allowImplicitScrolling,他们实际控制了 ListView 的滑动。注意这里将 enableScroll 放在一个类中,而不是直接声明。

完整的 ListView 代码如下:

    var listView = ListView(
      physics: CustomScrollPhysics(backtextInputData),
      children: [
        SingleChildScrollView(
          child: Form(
            key: formKey,
            child: Column(children: list),
          ),
        )
      ],
    );
    return listView;

完整的逻辑是,当鼠标进入表格区域时,关闭 ListView 的滑动效果。反之当鼠标离开表格时,打开 ListView 的滑动效果。