Flutter 颤振:如何使ListView对指针事件透明(而不是其非透明内容)?

Flutter 颤振:如何使ListView对指针事件透明(而不是其非透明内容)?,flutter,flutter-layout,flutter-sliver,Flutter,Flutter Layout,Flutter Sliver,我有一个可滚动的(列表视图或任何其他),它包含一个透明的小部件,比如说容器(高度:200)。我可以看穿小部件和可滚动部件(换句话说,我可以看到可滚动部件后面的小部件) 我怎样才能点击透明小部件和可滚动小部件,从而到达可滚动小部件后面的小部件 ListView( children: [ Container(height: 200), // Transparent. Container(color: Colors.red, height: 200), ], ); 请注意

我有一个
可滚动的
列表视图
或任何其他),它包含一个透明的小部件,比如说
容器(高度:200)
。我可以看穿小部件和可滚动部件(换句话说,我可以看到可滚动部件后面的小部件)

我怎样才能点击透明小部件和可滚动小部件,从而到达可滚动小部件后面的小部件

ListView(
  children: [
    Container(height: 200), // Transparent.
    Container(color: Colors.red, height: 200),
    ],
);

请注意,我无法使用
IgnorePointer
包装滚动表,因为我仍然希望单击滚动表中的不透明小部件。

我能想到的唯一合理解决方案是在透明容器上安装一个
GestureDetector
,它将为您提供点击的全局位置:

GestureDetector(
  onTapUp: (TapUpDetails tapUpDetails) {
    print("onTapUp global: " + tapUpDetails.globalPosition.toString());
  },
然后向列表后面的小部件添加一个
,并使用它获取小部件矩形左上角的全局位置以及小部件的大小,然后使用这些来获取小部件的矩形:

RenderBox renderBox = _key.currentContext.findRenderObject();
Offset topLeftCorner = renderBox.localToGlobal(Offset.zero);
Size size = renderBox.size;
Rect rectangle = topLeftCorner & size;
如果后台小部件不移动,您可以使用
WidgetsBinding.instance.addPostFrameCallback
在下一帧的
initState
中执行此操作(如果在
initState
中同步执行,则渲染对象将为空)并保存
Rect
——否则每次点击都必须重新计算

最后,在透明容器上的每次点击中,您可以计算点击的位置是否在后台小部件的边界内,并调用相应的代码:

// if tap is within boundaries of the background widget
if (rectangle.contains(tapUpDetails.globalPosition)) {
  // your code here
}

您所说的“包含透明小部件”是什么意思?作为可滚动下方的子对象或堆叠在可滚动父对象下方的子对象?我指的是上方的
容器(高度:200)
。“我到达可滚动后面的小部件”是什么意思?您能否提供更多有关您试图实现的视觉效果的详细信息?我不认为你可以点击一个透明的小部件,但是你可以改变你的布局,使它在视觉上保持不变,并且你想要点击的小部件实际上在顶部。@Ovidiu想象你有一个覆盖整个屏幕的堆栈中的ListView。列表视图位于顶部。您可以通过非透明窗口小部件拖动它。你可以点击透明的。谢谢你的回答。最后我改变了我的要求,不再需要这个了,所以我没有机会测试你的答案。但我认为它可以工作,所以我会接受它。如果有一天我再次需要它,我会尝试实现它,然后回来让你知道。