← Назад к вопросам

Какие жесты обрабатывает Flutter?

1.0 Junior🔥 181 комментариев
#Flutter виджеты#Анимации

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Жесты в Flutter

Flutter предоставляет мощный и гибкий механизм обработки жестов пользователя. Система жестов в Flutter основана на двух основных уровнях: Pointer события и Gesture детектор.

Уровень Pointer событий

На самом низком уровне находятся pointer события, которые отслеживают взаимодействие пользователя с экраном:

  • PointerDownEvent — палец коснулся экрана
  • PointerMoveEvent — палец движется по экрану
  • PointerUpEvent — палец поднят с экрана
  • PointerCancelEvent — событие прервано системой

Для обработки этих событий используется виджет Listener:

Listener(
  onPointerDown: (PointerDownEvent event) {
    print("Палец коснулся: ${event.position}");
  },
  onPointerMove: (PointerMoveEvent event) {
    print("Позиция: ${event.position}");
  },
  onPointerUp: (PointerUpEvent event) {
    print("Палец поднят");
  },
  child: Container()
)

Высокоуровневые жесты (GestureDetector)

GestureDetector — это основной виджет для обработки жестов. Он распознает различные типы жестов и вызывает соответствующие коллбеки:

Одиночные касания:

  • onTap — однократное касание
  • onLongPress — долгое касание
  • onDoubleTap — двойное касание

Движения:

  • onPanStart — начало перетаскивания
  • onPanUpdate — движение во время перетаскивания
  • onPanEnd — конец перетаскивания

Масштабирование:

  • onScaleStart — начало масштабирования
  • onScaleUpdate — изменение масштаба
  • onScaleEnd — конец масштабирования
GestureDetector(
  onTap: () => print("Нажато!"),
  onLongPress: () => print("Долгое нажатие"),
  onDoubleTap: () => print("Двойной тап"),
  onPanUpdate: (DragUpdateDetails details) {
    print("Позиция: ${details.globalPosition}");
  },
  onScaleUpdate: (ScaleUpdateDetails details) {
    print("Масштаб: ${details.scale}");
  },
  child: Container()
)

Специализированные детекторы

Flutter также предоставляет специальные виджеты:

  • Draggable и DragTarget — для drag-and-drop операций
  • FloatingActionButton — встроенная обработка нажатий
  • Scrollable — автоматическое управление жестами прокрутки
  • HorizontalDragGestureRecognizer и VerticalDragGestureRecognizer — для жестов в конкретном направлении

Система распознавания жестов (GestureRecognizer)

Для более сложных случаев используются GestureRecognizer — это низкоуровневый механизм, который позволяет создавать кастомные распознаватели жестов:

final tapRecognizer = TapGestureRecognizer();
tapRecognizer.onTap = () => print("Tap!");

RawGestureDetector(
  gestures: {
    TapGestureRecognizer: GestureRecognizerFactoryWithHandlers<TapGestureRecognizer>(
      () => TapGestureRecognizer(),
      (recognizer) => recognizer.onTap = () => print("Tap!"),
    )
  },
  child: Container()
)

Приоритет жестов

Жесты в Flutter имеют приоритет арены: когда несколько распознавателей конкурируют за событие, выигрывает наиболее специфичный жест. Это управляется через GestureArena.

Практические примеры

// Свайпы
GestureDetector(
  onHorizontalDragEnd: (details) {
    if (details.velocity.pixelsPerSecond.dx > 0) {
      print("Свайп вправо");
    } else {
      print("Свайп влево");
    }
  },
  child: Container()
)

Итоги

Flutter обрабатывает жесты через несколько слоев абстракции: от низкоуровневых pointer событий до высокоуровневых GestureDetector. Правильный выбор инструмента зависит от сложности требуемого функционала. Для большинства приложений достаточно GestureDetector, но для специфических случаев можно использовать Listener, RawGestureDetector или кастомные GestureRecognizer.