Flutter PageView在Web桌面模式下无法滑动该如何解决?
问题原因
Flutter 2.5及以上版本对桌面端(含Web桌面环境)的滚动组件默认仅开放触摸、触控板滚动支持,未包含鼠标拖动触发滑动的配置,这就是你在Chrome桌面模式下无法拖动PageView切换页面的核心原因。
解决方法
你可以选择单组件适配或者全局适配两种方案:
方案1:单独给当前PageView添加鼠标滑动支持
在你的MyStatelessWidget的build方法中,给PageView外层包裹ScrollConfiguration组件,手动追加鼠标拖动的支持,修改后代码如下:
首先要在文件头部引入dart:ui依赖:
import 'dart:ui';
然后修改build方法的返回值:
@override Widget build(BuildContext context) { final PageController controller = PageController(initialPage: 0); return ScrollConfiguration( behavior: ScrollConfiguration.of(context).copyWith( dragDevices: { PointerDeviceKind.touch, PointerDeviceKind.mouse, }, ), child: PageView( scrollDirection: Axis.horizontal, controller: controller, children: const <Widget>[ Center(child: Text('First Page')), Center(child: Text('Second Page')), Center(child: Text('Third Page')), ], ), ); }
方案2:全局配置所有滚动组件支持鼠标滑动
如果希望整个应用的所有滚动类组件(ListView、GridView、PageView等)都支持桌面端鼠标拖动,可以全局自定义滚动行为:
- 先定义自定义滚动行为类,同样需要先导入
dart:ui:
import 'dart:ui'; class CustomScrollBehavior extends MaterialScrollBehavior { @override Set<PointerDeviceKind> get dragDevices => { PointerDeviceKind.touch, PointerDeviceKind.mouse, }; }
- 在
MyApp的MaterialApp中配置该滚动行为:
@override Widget build(BuildContext context) { return MaterialApp( title: _title, scrollBehavior: CustomScrollBehavior(), home: Scaffold( appBar: AppBar(title: const Text(_title)), body: const MyStatelessWidget(), ), ); }
两种方案修改后重新编译运行,Web桌面端即可正常用鼠标拖动切换PageView页面。
内容的提问来源于stack exchange,提问作者amir_a14
相关产品推荐
相关产品推荐

