Flutter嵌套GestureDetector的scale类手势无法同时触发如何解决
问题原因
Flutter 手势系统采用手势竞技场机制判断同类型手势的消费者,默认仅允许竞争胜出的GestureDetector消费事件。你嵌套的两个GestureDetector都监听了缩放类手势事件,子组件的onScaleEnd胜出后,父组件的onScaleUpdate就无法收到回调,该问题和HitTestBehavior的设置无关。
解决方案
方案1:合并回调到同一个GestureDetector(推荐)
直接移除嵌套的多余GestureDetector,将两个回调都挂载到同一个检测器上即可,修改后的代码如下:
class _MapPageState extends State<MapPage> { @override Widget build(BuildContext context) { return Scaffold( body: GestureDetector( onScaleUpdate: _onScaleUpdate, onScaleEnd: _onScaleEnd, behavior: HitTestBehavior.translucent, child: Container( color: Colors.orange ), ), ); } _onScaleUpdate(ScaleUpdateDetails details) async { print("_onScaleUpdate"); } _onScaleEnd(ScaleEndDetails details) async { print("_onScaleEnd ${details.pointerCount}"); } }
方案2:自定义手势识别器绕过竞技场规则
如果业务逻辑必须保留嵌套的GestureDetector结构,可以自定义缩放手势识别器,修改竞技场落败时的默认逻辑,强制让识别器接收事件:
- 先自定义识别器类:
import 'package:flutter/gestures.dart'; class MultiAcceptScaleGestureRecognizer extends ScaleGestureRecognizer { @override void rejectGesture(int pointer) { // 竞技场落败时也强制接受该手势事件 acceptGesture(pointer); } }
- 替换原有的嵌套
GestureDetector为RawGestureDetector,使用自定义的识别器即可。
内容的提问来源于stack exchange,提问作者Alexey Lapshin
相关产品推荐
相关产品推荐

