Flutter中InteractiveViewer嵌套ListView缩放后无法垂直滚动问题咨询
问题原因
InteractiveViewer默认会处理所有方向的平移手势,和ListView的垂直滚动手势产生冲突,缩放状态下手势优先被InteractiveViewer消费,因此会出现放大后无法滚动到ListView上下边界的问题。
问题复现效果:
解决方案
方案1:限制InteractiveViewer平移方向(推荐,性能最优)
适合PDF类上下滚动浏览、缩放后仅需左右平移查看超出屏幕内容的场景,直接设置InteractiveViewer仅处理水平方向平移,垂直手势完全交给ListView处理:
Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: InteractiveViewer( panAxis: PanAxis.horizontal, // 仅允许水平方向平移 scaleEnabled: true, panEnabled: true, child: ListView.builder( padding: EdgeInsets.zero, itemCount: 10, itemBuilder: (context, _index) { print(_index); return Container( color: Colors.grey, height: MediaQuery.of(context).size.width * 1.1, width: MediaQuery.of(context).size.width, padding: EdgeInsets.all(2), child: Container( padding: EdgeInsets.all(2), color: Colors.white, child: Center( child: Text('Page index: $_index'), ), ), ); }, ), ), ); }
方案2:InteractiveViewer接管所有平移操作
适合需要缩放后自由上下左右平移内容的场景,禁用ListView自身滚动,让InteractiveViewer接管所有平移逻辑,注意该方案会一次性渲染所有ListView子项,适合子项数量较少的场景:
Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: InteractiveViewer( scaleEnabled: true, panEnabled: true, child: ListView.builder( padding: EdgeInsets.zero, physics: const NeverScrollableScrollPhysics(), // 禁用ListView自身滚动 shrinkWrap: true, // 让ListView高度适配所有子项总高度 itemCount: 10, itemBuilder: (context, _index) { print(_index); return Container( color: Colors.grey, height: MediaQuery.of(context).size.width * 1.1, width: MediaQuery.of(context).size.width, padding: EdgeInsets.all(2), child: Container( padding: EdgeInsets.all(2), color: Colors.white, child: Center( child: Text('Page index: $_index'), ), ), ); }, ), ), ); }
内容的提问来源于stack exchange,提问作者Nikhileshwar
相关产品推荐
相关产品推荐

