[英]Flutter - prevent tap/click events from being passed through view hierarchy
[英]Flutter: how to prevent touch events being passed down to children?
我試圖將我的整個應用程序包裝在一個小部件中,以防止觸摸事件根據某些條件通過視圖層次結構向下傳遞。 我已經有了一個WrapperlifecycleListener
:
@override
Widget build(BuildContext context) {
return WrapperAppLifecycleListener(
child: Listener(
onPointerDown: (_) {
//other stuff I do
},
child: MyApp(),
),
);
}
我期待能夠做這樣的事情:
onPointerDown: (_) {
if(passThrough){
return true;
} else {
return false;
}
},
但是到目前為止我發現的所有小部件都將void
作為其回調的返回類型,是否有任何小部件可以執行類似的操作?
編輯:當用戶與應用程序本身交互時,條件會發生變化,因此 IgnorePointer 或 AbsorbPointer 在這種情況下不起作用。 為了更清楚地考慮我想在觸摸輸入后禁用所有觸摸輸入的情況,所以假設:
@override
Widget build(BuildContext context) {
return WrapperAppLifecycleListener(
child: Listener(
onPointerDown: (_) {
if(absorb){
return false;
} else {
return true;
}
absorb = true;
Future.delayed(Duration(seconds:2)).then((value) => absorb = false);
},
child: MyApp(),
),
);
}
看起來您想要樹中的AbsorbPointer
( 鏈接) 或IgnorePointer
( 鏈接) 小部件。 兩者都可以通過 boolean 屬性進行控制。
有關差異的解釋,請參閱Flutter AbsorbPointer vs IgnorePointer difference
在尋找更好的解決方案時,我最終做的是:
class GestureInterceptor extends StatefulWidget {
final Widget child;
const GestureInterceptor({required this.child});
@override
_GestureInterceptorState createState() => _GestureInterceptorState();
}
class _GestureInterceptorState extends State<GestureInterceptor> {
var absorbTaps = false;
@override
Widget build(BuildContext context) {
return AbsorbPointer(
absorbing: absorbTaps,
child: WrapperAppLifecycleListener(
child: Listener(
onPointerDown: (_) {
setState(() {
absorbTaps = true;
});
Future.delayed(Duration(milliseconds: 400))
.then((value) => setState(() {
absorbTaps = false;
}));
},
child: widget.child,
),
),
);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.