Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
669 of 1024 menu
◀ ▶

Виджет GestureDetector

Виджет GestureDetector не рисует сам, а вешает обработчики на child. Короткое нажатие ловят через onTap, долгое - через onLongPress, сдвиг пальцем - через onPanUpdate. Параметр behavior задаёт HitTestBehavior и решает, кто получит попадание.

Синтаксис

GestureDetector( onTap: () {}, child: child, )

Параметры

Параметр Описание
child Дочерний виджет, на котором ловят жесты.
onTap Вызывается при коротком нажатии.
onDoubleTap Вызывается при двойном нажатии.
onLongPress Вызывается при долгом нажатии.
onPanUpdate Вызывается при перетаскивании, передаёт смещение.
behavior Как участвовать в hit test. Принимает HitTestBehavior.

Пример

Давайте сменим текст по нажатию:

import 'package:flutter/material.dart'; class TapLabel extends StatefulWidget { const TapLabel({super.key}); @override State<TapLabel> createState() => _TapLabelState(); } class _TapLabelState extends State<TapLabel> { var label = 'abcde'; @override Widget build(BuildContext context) { return GestureDetector( onTap: () { setState(() { label = label == 'abcde' ? '12345' : 'abcde'; }); }, child: Text(label), ); } } void main() { runApp( MaterialApp( home: Scaffold( body: Center( child: TapLabel(), ), ), ), ); }

На экране по центру текст 'abcde'; при каждом нажатии он меняется на '12345' и обратно.

Пример

Давайте сдвинем квадрат перетаскиванием:

import 'package:flutter/material.dart'; class DragBox extends StatefulWidget { const DragBox({super.key}); @override State<DragBox> createState() => _DragBoxState(); } class _DragBoxState extends State<DragBox> { var offset = Offset.zero; @override Widget build(BuildContext context) { return GestureDetector( onPanUpdate: (details) { setState(() { offset += details.delta; }); }, child: Transform.translate( offset: offset, child: Container( width: 80, height: 80, color: Colors.teal, alignment: Alignment.center, child: const Text('abcde'), ), ), ); } } void main() { runApp( MaterialApp( home: Scaffold( body: Center( child: DragBox(), ), ), ), ); }

На экране бирюзовый квадрат следует за пальцем или курсором при перетаскивании.

Смотрите также

  • виджет InkWell,
    который рисует чернильное пятно при нажатии на Material
  • виджет Listener,
    который получает сырые события указателя
  • перечисление HitTestBehavior,
    которое настраивает попадание для GestureDetector
  • виджет RawGestureDetector,
    который подключает свои распознаватели жестов
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить