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

Flutter Web端水平ListView鼠标滚轮滚动失效问题如何解决

解决Flutter Web水平ListView鼠标滚轮无法滚动的问题

方法1:全局配置滚动行为(全项目生效)

修改全局滚动规则后,项目内所有水平滚动组件默认支持鼠标操作,无需逐个适配。
首先在main.dart中自定义滚动行为类:

import 'dart:ui';
import 'package:flutter/material.dart';

class CustomScrollBehavior extends MaterialScrollBehavior {
  // 允许鼠标拖拽滚动
  @override
  Set<PointerDeviceKind> get dragDevices => {
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
  };

  // 适配鼠标滚轮滚动逻辑
  @override
  ScrollPhysics getScrollPhysics(BuildContext context) {
    return const AlwaysScrollableScrollPhysics();
  }
}

之后将自定义滚动行为配置到MaterialApp/CupertinoApp的scrollBehavior属性:

MaterialApp(
  scrollBehavior: CustomScrollBehavior(),
  // 其余原有配置不变
  home: const MyHomePage(),
)

配置完成后,正常滚动鼠标滚轮即可触发水平ListView滚动,也支持按住鼠标直接拖拽滚动。

方法2:仅为当前ListView单独配置

如果不需要修改全局规则,仅需要这一个水平ListView支持鼠标滚轮,可以用滚动控制器+事件监听实现:

import 'dart:ui';
import 'package:flutter/material.dart';

class HorizontalListPage extends StatefulWidget {
  const HorizontalListPage({super.key});

  @override
  State<HorizontalListPage> createState() => _HorizontalListPageState();
}

class _HorizontalListPageState extends State<HorizontalListPage> {
  final ScrollController _scrollController = ScrollController();

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Listener(
      onPointerSignal: (event) {
        if (event is PointerScrollEvent) {
          // 鼠标滚轮滚动时手动修改滚动偏移,系数可自行调整滚动速度
          _scrollController.animateTo(
            _scrollController.offset + event.scrollDelta.dy * 1.2,
            duration: const Duration(milliseconds: 100),
            curve: Curves.easeInOut,
          );
        }
      },
      child: ListView(
        controller: _scrollController,
        scrollDirection : Axis.horizontal,
        children: <Widget>[
          Container(width: 160.0, color: Colors.red),
          Container(width: 160.0, color: Colors.blue),
          Container(width: 160.0, color: Colors.green),
          Container(width: 160.0, color: Colors.yellow),
          Container(width: 160.0, color: Colors.orange),
        ],
      ),
    );
  }
}

临时测试方案(无需修改代码)

如果只是临时验证功能效果,可以直接用两种操作触发滚动:

  • 按住鼠标左键拖拽水平ListView的内容区域
  • 使用笔记本触摸板双指横向滑动内容区域

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:27:03