【交互 widget】Flutter GestureDetector

简介: 【交互 widget】Flutter GestureDetector

image.png

一个能识别手势的 widget。相比于 Listener,GestureDetector,更加常用。

GestureDetector 介绍

GestureDetector 就不分析源码了,有兴趣的同学可以读下这篇 从源码看flutter(五):GestureDetector篇。简单的介绍下,GestureDetector 是一个 StateFulWidget,内部调用 RawGestureDetector,RawGestureDetector 又调用 Listener 监听 onPointerDown 和 onPointerPanZoomStart 事件。GestureDetector 作用仅是简化 RawGestureDetector 的使用。作为平时使用 GestureDetector 的功能就足够了。哪天如果不能满足的时候,再去找 RawGestureDetector。

使用 GestureDetector

GestureDetector 使用了很多手势识别器,最常用的就是 TapGestureRecognizer 了,使用起来很简单。

GestureDetector(
 onTap: () {
   print('tap');
 },
 child: Container(
   width: 100,
   height: 100,
   color: Colors.blue,
 ))
复制代码

如果没有 child 要响应 pointer 事件,需要指定 behavior。

GestureDetector(
    behavior: HitTestBehavior.opaque,
    onTap: () {
      debugPrint('tap');
    },
 );
复制代码

opaque 的含义在 Listener 中有讲。

其它手势也都一样,使用还是很简单的,真正需要我们关心的是手势冲突。

有多个手势竞争的时候,child 的手势会胜出

GestureDetector(
      onTap: () {
        debugPrint('tap parent');
      },
      child: GestureDetector(
        behavior: HitTestBehavior.opaque,
        onTap: () {
          debugPrint('tap child');
        },
      ),
    );
复制代码

只输出 tap child。 当 parent 和 child 同时响应 onTap 时, child 胜出。当有多个手势参与竞争的时候,需要竞技场管理者进行裁决。当 pointer up 事件发出的时候,竞技场管理者判定第一个位置的 tap 手势选手胜出。在执行 hitTest 的时候,是深度优先,所以 child 会先加入 结果列表,位置一定在 parent 前面。

pointer move 事件会打断 tap

GestureDetector(
      behavior: HitTestBehavior.opaque,
      onHorizontalDragEnd: (details) {
        debugPrint('darg end');
      },
      onTapDown: (details) {
        debugPrint('tap down');
      },
      onTap: () {
        debugPrint('tap');
      },
    );
复制代码

如果有滑动手势胜出,输出 “tap down” 和 “move end”。

pointer down 后在一定时间内滑动超过一定距离,那么就会被判定为 PointerMoveEvent,tap 手势被移出竞技场。tapUp 和 tap 事件不会再响应。tapDown 会响应,因为 tapDown 在 pointerDownEvent 的时候就被裁决出来了。

同时存在 tap ,doubleTap

只有 tap 的时候,pointer up 的时候,立即执行,如果同时存在 double tap,需要等上 300ms,因为要判断是否要响应 double tap。tap ,doubleTap 只能有一个胜出。

同时存在 tap ,onLongPress

如果同时存在 tap,onLongPress,需要等上 500ms,因为要判断是否要响应 longPress。tap ,onLongPress 只能有一个胜出。

虽然只举这几个例子,但当多个手势竞争的时候必然会有冲突,解决冲突可以用 Listener 替代。

目录
相关文章
|
4月前
|
容器
flutter GestureDetector 的 behavior属性
【8月更文挑战第21天】
88 4
|
8天前
|
容器
Flutter Widget 解析
Flutter Widget 解析
|
8天前
|
存储 容器
Flutter 有状态Widget 和 无状态Widget
Flutter 有状态Widget 和 无状态Widget
|
1月前
深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
本文详细介绍了Flutter中如何通过继承其他Widget来创建自定义组件。首先解释了Widget继承的基本概念,包括StatelessWidget和StatefulWidget的区别。接着通过具体示例展示了如何继承StatelessWidget和StatefulWidget,并在子类中访问父类的build方法和状态。最后,结合多个自定义Widget展示了如何在实际应用中灵活使用继承和组合来构建复杂的UI。
80 8
|
1月前
|
容器
flutter&鸿蒙next 使用 InheritedWidget 实现跨 Widget 传递状态
在 Flutter 中,状态管理至关重要。本文详细介绍了如何使用 InheritedWidget 实现跨 Widget 的状态传递。InheritedWidget 允许数据在 Widget 树中向下传递,适用于多层嵌套的场景。通过一个简单的计数器示例,展示了如何创建和使用 InheritedWidget,包括其基础概念、工作原理及代码实现。虽然 InheritedWidget 较底层,但它是许多高级状态管理解决方案的基础。
107 2
|
1月前
|
Dart UED 开发者
Flutter&鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面的重要组成部分。Flutter提供了多种内置按钮组件,但有时这些样式无法满足特定设计需求。因此,封装一个自定义按钮组件变得尤为重要。自定义按钮组件可以确保应用中所有按钮的一致性、可维护性和可扩展性,同时提供更高的灵活性,支持自定义颜色、形状和点击事件。本文介绍了如何创建一个名为CustomButton的自定义按钮组件,并详细说明了其样式、形状、颜色和点击事件的处理方法。
89 1
|
2月前
|
容器
flutter:第一个flutter&Widget的使用 (二)
本文介绍了Flutter框架下的基本组件及其用法,包括简单的 Stateless Widget 如文本和按钮,以及更复杂的 StatefulWidget 示例。详细解释了如何使用 `context` 获取祖先小部件的信息,并展示了 `MaterialApp` 的属性及用途。此外,还探讨了 `StatefulWidget` 与 `StatelessWidget` 的区别,以及 `AppBar` 的常见属性配置方法。适合Flutter初学者参考学习。
|
1月前
|
Dart JavaScript 前端开发
Flutter 的 Widget 概述与常用 Widgets 与鸿蒙 Next 的对比
Flutter 是 Google 开发的开源 UI 框架,用于快速构建高性能的移动、Web 和桌面应用。Flutter 通过 Widget 构建 UI,每个 UI 元素都是 Widget,包括文本、按钮、图片等。Widget 不仅描述外观,还描述行为,是不可变的。常见的 Widget 包括结构型(Container、Column、Row)、呈现型(Text、Image)、交互型(ElevatedButton)和状态管理型(StatefulWidget)。Flutter 与鸿蒙 Next 在组件化架构、开发语言、布局系统、性能和跨平台支持方面各有优势
79 0
|
5月前
Flutter-底部弹出框(Widget层级)
文章描述了如何在Flutter中使用DraggableScrollableSheet创建一个底部弹出框,同时保持其可手势滑动关闭。作者遇到问题并提出对原控件进行扩展,以支持头部和列表布局的滑动关闭功能。
201 0
|
6月前
|
容器
flutter GestureDetector 点击空白区域无反应解决办法
flutter GestureDetector 点击空白区域无反应解决办法
153 0