Flutter 颤振传递手势检测细节到下堆栈小部件

Flutter 颤振传递手势检测细节到下堆栈小部件,flutter,dart,widget,stack,gesturedetector,Flutter,Dart,Widget,Stack,Gesturedetector,我有一个堆栈,上面有两个小部件。较低的一个应该能够检测手势检测,但这是不可能的,因为上面的一个正在阻止它。我的设置: return Stack( children: [ Hero( tag: month.name + 'image', child: Container( height: _scaledWidth, width: _scaledWidth, child: PaintService.getCo

我有一个
堆栈
,上面有两个
小部件
。较低的一个应该能够检测
手势检测
,但这是不可能的,因为上面的一个正在阻止它。我的设置:

    return Stack(
  children: [
    Hero(
      tag: month.name + 'image',
      child: Container(
        height: _scaledWidth,
        width: _scaledWidth,
        child: PaintService.getCollageImagesFromCollageOption(
          month.collageOption,
          month.images,
          _scaledWidth,
        ),
      ),
    ),
    Hero(
      tag: month.name + 'shape',
      child: Container(
        height: _scaledWidth,
        width: _scaledWidth,
        child: PaintService.getShapeFromCollageOption(
            month.collageOption, _scaledWidth),
      ),
    ),
  ],
);

上面的小部件是图片中的白色框架,它必须位于图像的顶部。但是图像应该是可转换的,我喜欢这样:

  Widget build(BuildContext context) {
final _zoom = useState<double>(1.0);
final _previousZoom = useState<double>(1.0);
final _offset = useState<Offset>(Offset.zero);
final _previousOffset = useState<Offset>(Offset.zero);
final _startingFocalPoint = useState<Offset>(Offset.zero);

final _zoom_2 = useState<double>(1.0);
final _previousZoom_2 = useState<double>(1.0);
final _offset_2 = useState<Offset>(Offset.zero);
final _previousOffset_2 = useState<Offset>(Offset.zero);
final _startingFocalPoint_2 = useState<Offset>(Offset.zero);
return Stack(
  children: [
    Positioned(
      top: 0,
      left: 0,
      right: 0,
      bottom: 0,
      child: GestureDetector(
        onTap: () => print("tapped"),
        onScaleStart: (details) {
          _startingFocalPoint.value = details.focalPoint;
          _previousOffset.value = _offset.value;
          _previousZoom.value = _zoom.value;
        },
        onScaleUpdate: (details) {
          _zoom.value = _previousZoom.value * details.scale;
          final Offset normalizedOffset =
              (_startingFocalPoint.value - _previousOffset.value) /
                  _previousZoom.value;
          _offset.value =
              details.focalPoint - normalizedOffset * _zoom.value;
        },
        child: ClipPath(
          clipper: _Position1ClipperImage(),
          child: Transform(
            transform: Matrix4.identity()
              ..translate(_offset.value.dx, _offset.value.dy)
              ..scale(_zoom.value),
            child: Image.asset(widget.images[0].path,
                width: widget.width,
                height: widget.width,
                fit: BoxFit.fill),
          ),
        ),
      ),
    ),
    Positioned(
      top: 0,
      left: 0,
      right: 0,
      bottom: 0,
      child: GestureDetector(
        onTap: () => print("tapped"),
        onScaleStart: (details) {
          _startingFocalPoint_2.value = details.focalPoint;
          _previousOffset_2.value = _offset_2.value;
          _previousZoom_2.value = _zoom_2.value;
        },
        onScaleUpdate: (details) {
          _zoom_2.value = _previousZoom_2.value * details.scale;
          final Offset normalizedOffset =
              (_startingFocalPoint_2.value - _previousOffset_2.value) /
                  _previousZoom_2.value;
          _offset_2.value =
              details.focalPoint - normalizedOffset * _zoom_2.value;
        },
        child: ClipPath(
          clipper: _Position2ClipperImage(),
          child: Transform(
            transform: Matrix4.identity()
              ..translate(_offset_2.value.dx, _offset_2.value.dy)
              ..scale(_zoom_2.value),
            child: Image.asset(widget.images[1].path,
                width: widget.width,
                height: widget.width,
                fit: BoxFit.fill),
          ),
        ),
      ),
    ),
  ],
);


}
小部件构建(构建上下文){
最终缩放=使用状态(1.0);
最终_previousZoom=使用状态(1.0);
最终_offset=useState(offset.zero);
最终_previousOffset=useState(Offset.zero);
最终_startingFocalPoint=useState(偏移量为零);
最终缩放2=使用状态(1.0);
最终_previousZoom_2=使用状态(1.0);
最终_offset_2=使用状态(offset.zero);
最终_previousOffset_2=使用状态(Offset.zero);
最终_开始焦点_2=使用状态(偏移量为零);
返回堆栈(
儿童:[
定位(
排名:0,
左:0,,
右:0,,
底部:0,
儿童:手势检测器(
onTap:()=>打印(“点击”),
规模启动:(详细信息){
_startingFocalPoint.value=details.focalPoint;
_previousOffset.value=_offset.value;
_previousZoom.value=\u zoom.value;
},
规模更新:(详细信息){
_zoom.value=\u previousZoom.value*details.scale;
最终偏移规格化偏移=
(_startingFocalPoint.value-_previousOffset.value)/
_先前的值;
_偏移量=
details.focalPoint-规格化偏移*_zoom.value;
},
孩子:克利帕斯(
裁剪器:_位置1clipperimage(),
孩子:变换(
转换:Matrix4.identity()
…平移(_offset.value.dx,_offset.value.dy)
…比例(缩放值),
子项:Image.asset(widget.images[0]。路径,
宽度:widget.width,
高度:widget.width,
适合:BoxFit.填充),
),
),
),
),
定位(
排名:0,
左:0,,
右:0,,
底部:0,
儿童:手势检测器(
onTap:()=>打印(“点击”),
规模启动:(详细信息){
_startingFocalPoint_2.value=details.focalPoint;
_previousOffset_2.value=_offset_2.value;
_previousZoom_2.value=_zoom_2.value;
},
规模更新:(详细信息){
_zoom_2.value=\u previousZoom_2.value*details.scale;
最终偏移规格化偏移=
(_startingFocalPoint_2.值-_previousOffset_2.值)/
_上一个值;
_偏移量2.0=
details.focalPoint-规格化偏移*\u zoom\u 2.value;
},
孩子:克利帕斯(
裁剪器:_Position2ClipperImage(),
孩子:变换(
转换:Matrix4.identity()
…平移(_offset_2.value.dx,_offset_2.value.dy)
…缩放(缩放2.值),
子项:Image.asset(widget.images[1]。路径,
宽度:widget.width,
高度:widget.width,
适合:BoxFit.填充),
),
),
),
),
],
);
}
就像我说的,如果在图像顶部有第二个
小部件
(第一个代码片段),那么这就不起作用了

我知道我可以简单地将
手势检测器
移动到
顶级
小部件。但是我怎样才能把这些信息传递给我的图片呢?我被困在这里了


如果你需要更多信息,请告诉我

尝试用小部件包装顶部小部件


谢谢,伙计,工作得很有魅力:)
  IgnorePointer(
    child: Hero(
      tag: month.name + 'shape',
      child: Container(
        height: _scaledWidth,
        width: _scaledWidth,
        child: PaintService.getShapeFromCollageOption(
            month.collageOption, _scaledWidth),
      ),
    ),
  )