Flutter GestureDetector手势拖动的onVerticalDragUpdate监听方法无法触发

Flutter 关于GestureDetector手势拖动的onVerticalDragUpdate监听方法无法触发的问题

问题
如果里面只有一个container会触发,但是如果里面包裹的是一个listview,就不会触发这个方法了

示例代码

Expanded(
   child: GestureDetector(
     onVerticalDragStart: (v) => print('onVerticalDragStart'),
     onVerticalDragDown: (v) => print('$v'),
     onVerticalDragUpdate: (v) => print('$v'),
     onVerticalDragCancel: () => print('onVerticalDragCancel'),
     onVerticalDragEnd: (v) => print('onVerticalDragEnd'),
     child: Center(
         child: ListView.builder(
       itemBuilder: (context, index) {
         return SizedBox(height: 50.h, child: Text('$index'));
       },
       itemCount: 30,
     )),
   ),
 ),

 GestureDetector(
   onVerticalDragStart: (v) => print('onVerticalDragStart'),
   onVerticalDragDown: (v) => print('onVerticalDragDown'),
   onVerticalDragUpdate: (v) => print('onVerticalDragUpdate'),
   onVerticalDragCancel: () => print('onVerticalDragCancel'),
   onVerticalDragEnd: (v) => print('onVerticalDragEnd'),
   child: Center(
     child: Container(
       width: 200,
       height: 200,
       color: Colors.red,
     ),
   ),
 )

问题原因

ListView在手势竞技场提前胜出,所以尽管GestureDetector可以监听到对应的PointerEvent,但是在其handleEvent中不会调用对应的callback了。因而使用Listener仍旧可以监听到对应的PointerEvent,可以自行决定如何响应事件。

解决方案代码

Listener(
  // 手指按下触发
  onPointerDown: (PointerDownEvent e) {
    print(e.localPosition.dy)
  },
  // 手指滑动时触发
  onPointerMove: (PointerMoveEvent e) {
    print(e.localPosition.dy)
  },
  child: Center(
     child: ListView.builder(
     itemBuilder: (context, index) {
       return SizedBox(height: 50.h, child: Text('$index'));
     },
     itemCount: 30,
   ))
),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值