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。列表视图位于顶部。您可以通过非透明窗口小部件拖动它。你可以点击透明的。谢谢你的回答。最后我改变了我的要求,不再需要这个了,所以我没有机会测试你的答案。但我认为它可以工作,所以我会接受它。如果有一天我再次需要它,我会尝试实现它,然后回来让你知道。