簡體   English   中英

Flutter:如何防止觸摸事件傳給孩子?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM