• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Flutter 父子组件都能收到点击事件

武飞扬头像
bawomingtian123
帮助1

在实际项目中,在使用点击事件时,由于需求设计问题,需要子组件和父组件都能收到onTap回调,故会出现类似下面demo中的源码。

学新通

 按照Flutter 点击事件的设计思路,这样的源码肯定是满足不了需求,在点击组件时,只有子组件会有回调打印,父组件是没有回调的。

那父组件怎么样才能也收到长按事件呢。我们按照以下修改可以满足需求

  1.  
    /// Created by wuliquan on 19.7.22.
  2.  
    /// 测试页面
  3.  
    class SecondPage extends StatefulWidget {
  4.  
    @override
  5.  
    State<StatefulWidget> createState() {
  6.  
    return SecondPageState();
  7.  
    }
  8.  
    }
  9.  
     
  10.  
    class SecondPageState extends State<SecondPage> {
  11.  
    @override
  12.  
    Widget build(BuildContext context) {
  13.  
    return Center(
  14.  
    child: RawGestureDetector(
  15.  
    gestures: {
  16.  
    AllowMultipleGestureRecognizer: GestureRecognizerFactoryWithHandlers<AllowMultipleGestureRecognizer>(
  17.  
    () => AllowMultipleGestureRecognizer(),
  18.  
    (AllowMultipleGestureRecognizer instance) {
  19.  
    instance.onTap = () => print('tap on parent ');
  20.  
    },
  21.  
    )
  22.  
    },
  23.  
    //Parent Container
  24.  
    child: Container(
  25.  
    width: 100,
  26.  
    height: 100,
  27.  
    color: Colors.blue,
  28.  
    alignment: Alignment.center,
  29.  
    child: GestureDetector(
  30.  
    onLongPress: () {
  31.  
    print('tap on child');
  32.  
    },
  33.  
    child: Container(
  34.  
    width: 50,
  35.  
    height: 50,
  36.  
    color: Colors.orange,
  37.  
    ),
  38.  
    ),
  39.  
    )),
  40.  
    );
  41.  
    }
  42.  
    }
  43.  
     
  44.  
    class AllowMultipleGestureRecognizer extends TapGestureRecognizer {
  45.  
    @override
  46.  
    void rejectGesture(int pointer) {
  47.  
    acceptGesture(pointer);
  48.  
    }
  49.  
    }
学新通

使用RawGestureDetector包裹手势识别器AllowMultipleGestureRecognizer

AllowMultipleGestureRecognizer是我们继承TapGestureRecognizer 
复写了rejectGesture方法
  1.  
    @override
  2.  
    void rejectGesture(int pointer) {
  3.  
    acceptGesture(pointer);
  4.  
    }

重点:

这个方法在手势识别器在手势竞技场竞争失败后,我们手动处理,让它可以继续处理手势,从而我们父组件也能收到回调打印日志

这里简单说明下手势竞技的规则,在分配手势时按照深度优先的策略进行,这里由于我们只是注册了最简单的onTap回调,在底层上报up事件时,会直接返回命中测试组件列表中最后的那个组件,也就是深度最深的那个组件,也就是子组件。

以上面例子说明,在竞技场宣布子组件获胜后,会通知父组件的rejectGesture。由于我们复写了rejectGesture方法,让父手势识别器继续工作。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcbieh
系列文章
更多 icon
同类精品
更多 icon
继续加载