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 的滑动效果。