首页 > 解决方案 > 在 InteractiveViewer 中使用 GestureDetector

问题描述

是否可以在 InteractiveViewer 中使用 GestureDetector(特别是 onTapUp 手势)?

我知道 InteractiveViewer 本身使用 GestureDetector 并覆盖 onScaleEnd、onScaleStart 和 onScaleUpdate 方法来实现平移。但是,onTapUp 没有被覆盖,这让我认为有可能使用它。

标签: flutterdartwidget

解决方案


我做了一些挖掘,并在InteractiveViewer 的 TransformationController 文档中找到了toScene()方法:

返回给定视口点的场景点。

视口点是相对于父级的,而场景点是相对于子级的,与变换无关。使用视口点调用 toScene 本质上会返回给定变换位于视口点下方的场景坐标。

视口变换为子项的倒数(即向左移动子项相当于向右移动视口)。

当确定父事件发生在子事件的何处时,此方法通常很有用。此示例显示如何确定在子项上发生对父项的点击位置。

GestureDetector(
    onTapUp: (TapUpDetails details) {
      _childWasTappedAt = _transformationController.toScene(
        details.localPosition,
      );
    },
    child: InteractiveViewer(
      transformationController: _transformationController,
      child: child,
    ),   ); }

因此,建议的解决方案似乎不是将 GestureDetector 作为孩子,而是用 GestureDetector 包装 InteractiveViewer,使用自定义 TransformationController,并从此控制器获取相对于查看器视口的位置。


推荐阅读