首页 > 解决方案 > 在 Flutter 中,定位的 Widget 如何在其父 Stack 区域之外感觉到轻敲?

问题描述

AStack包含MyWidget在 a 中Positioned

Stack(
  overflow: Overflow.visible,
  children: [
    Positioned(
    top: 0.0,
    left: 0.0,
    child: MyWidget(),
  )],
);

由于溢出是Overflow.visible并且MyWidget大于Stack,它显示在 之外Stack,这就是我想要的。

但是,我无法点击该区域MyWidget之外的Stack区域。它只是忽略了那里的水龙头。

我如何确保MyWidget在那里接受手势?

标签: fluttergestureflutter-layout

解决方案


发生此行为是因为堆栈在检查子项是否被击中之前检查指针是否在其边界内:

类:RenderBox(RenderStack 扩展)

bool hitTest(BoxHitTestResult result, { @required Offset position }) {

    ...

    if (_size.contains(position)) {
      if (hitTestChildren(result, position: position) || hitTestSelf(position)) {
        result.add(BoxHitTestEntry(this, position));
        return true;
      }
    }
    return false;
}

我的解决方法是删除

if (_size.contains(position))

查看。不幸的是,如果不从框架中复制代码,这是不可能的。

这是我所做的:

  • 复制 Stack 类并将其命名为 Stack2
  • 复制 RenderStack 并将其命名为 RenderStack2
  • 制作 Stack2 参考 RenderStack2
  • 从上面添加了没有 _size.contains 检查的 hitTest 方法
  • 复制 Positioned 并将其命名为 Positioned2 并使其引用 Stack2 作为其通用参数
  • 在我的代码中使用了 Stack2 和 Positioned2

这个解决方案绝不是最优的,但它实现了预期的行为。


推荐阅读