You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web中nested_inner_scroll禁用鼠标滚轮滚动问题求助

解决nested_inner_scroll包Flutter Web鼠标滚轮失效问题

你推测的方向没错,这个问题确实和InnerScrollCoordinator的事件分发逻辑有关——该包默认未针对Web端的鼠标滚轮事件做适配,导致滚轮事件被拦截或未正确传递到对应滚动组件。可以尝试以下几种方案:

1. 自定义Coordinator处理滚轮事件

创建InnerScrollCoordinator的子类,重写滚动通知处理方法,手动适配Web鼠标滚轮的事件传递逻辑:

class CustomCoordinator extends InnerScrollCoordinator {
  CustomCoordinator({required super.state});

  @override
  bool handleScrollNotification(ScrollNotification notification) {
    // 保留原有嵌套滚动的核心逻辑
    final defaultResult = super.handleScrollNotification(notification);
    
    // 单独处理Web鼠标滚轮触发的滚动更新
    if (notification is ScrollUpdateNotification && notification.dragDetails == null) {
      final scrollDelta = notification.scrollDelta!;
      // 内列表已到顶部,把滚轮事件传递给外层
      if (innerController.position.pixels == innerController.position.minScrollExtent && scrollDelta < 0) {
        outerController.position.jumpTo(outerController.position.pixels + scrollDelta);
      }
      // 内列表已到底部,把滚轮事件传递给外层
      else if (innerController.position.pixels == innerController.position.maxScrollExtent && scrollDelta > 0) {
        outerController.position.jumpTo(outerController.position.pixels + scrollDelta);
      }
    }
    
    return defaultResult;
  }
}

然后在使用NestedInnerScroll时替换默认的coordinator:

NestedInnerScroll(
  coordinatorBuilder: (state) => CustomCoordinator(state: state),
  // 你的原有配置(外层滚动组件、内层滚动组件等)
)

2. 给内层滚动组件添加鼠标滚轮监听

直接通过MouseRegion给内层滚动组件绑定滚轮事件,手动控制内外滚动的触发时机:

MouseRegion(
  onWheel: (event) {
    final innerScroll = innerController;
    final outerScroll = outerController;
    final delta = event.delta.dy;

    if (innerScroll.position.pixels <= innerScroll.position.minScrollExtent && delta > 0) {
      // 内列表已顶,滚动外层
      outerScroll.position.jumpTo(outerScroll.position.pixels + delta);
    } else if (innerScroll.position.pixels >= innerScroll.position.maxScrollExtent && delta < 0) {
      // 内列表已底,滚动外层
      outerScroll.position.jumpTo(outerScroll.position.pixels + delta);
    } else {
      // 正常滚动内层
      innerScroll.position.jumpTo(innerScroll.position.pixels + delta);
    }
    event.preventDefault(); // 阻止默认行为避免冲突
  },
  child: ListView(
    controller: innerController,
    // 列表内容
  ),
)

3. 检查包版本或提交反馈

先确认你使用的是nested_inner_scroll的最新版本,可能官方已经修复了Web端滚轮适配问题。如果问题仍存在,可直接在包的仓库提交Issue,说明Web端鼠标滚轮失效的场景并附上最小复现代码,作者通常会针对性修复这类平台适配问题。


内容的提问来源于stack exchange,提问作者InvalidHop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:01:14