一尘不染

在Flutter中,定位的Widget如何感觉到其父Stack区域之外的点击?

flutter

一个Stack包含MyWidget的内部Positioned

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

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

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

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


阅读 1100

收藏
2020-08-13

共1个答案

一尘不染

发生此现象的原因在于,堆栈在检查子项是否被命中之前先检查指针是否在其边界内:

类: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
  • 从上面添加了hitTest方法,没有_size.contains检查
  • 复制位置并命名为Position2,并使其引用Stack2作为其通用参数
  • 在我的代码中使用了Stack2和Positioned2

该解决方案绝不是最佳解决方案,但是可以实现所需的行为。

2020-08-13