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

Виджет RawGestureDetector

Виджет RawGestureDetector оборачивает child и получает карту gestures: тип распознавателя и фабрика, которая его создаёт. Так можно собрать жест точнее, чем у GestureDetector. Параметр behavior задаёт HitTestBehavior.

Синтаксис

RawGestureDetector( gestures: { TapGestureRecognizer: GestureRecognizerFactoryWithHandlers<TapGestureRecognizer>( () => TapGestureRecognizer(), (TapGestureRecognizer instance) { instance.onTap = () {}; }, ), }, child: child, )

Параметры

Параметр Описание
child Дочерний виджет, на котором работают распознаватели.
gestures Карта типа распознавателя и фабрики с обработчиками.
behavior Участие в hit test. Принимает HitTestBehavior.
excludeFromSemantics Скрыть жесты от дерева доступности.

Пример

Давайте повесим свой TapGestureRecognizer:

import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; class RawTap extends StatefulWidget { const RawTap({super.key}); @override State<RawTap> createState() => _RawTapState(); } class _RawTapState extends State<RawTap> { var label = 'abcde'; @override Widget build(BuildContext context) { return RawGestureDetector( gestures: { TapGestureRecognizer: GestureRecognizerFactoryWithHandlers< TapGestureRecognizer >( () => TapGestureRecognizer(), (TapGestureRecognizer instance) { instance.onTap = () { setState(() { label = '12345'; }); }; }, ), }, child: Container( padding: const EdgeInsets.all(24), color: Colors.lightBlue.shade100, child: Text(label), ), ); } } void main() { runApp( MaterialApp( home: Scaffold( body: Center( child: RawTap(), ), ), ), ); }

На экране голубая плашка с 'abcde'; по нажатию текст сменится на '12345'.

Пример

Давайте добавим LongPressGestureRecognizer рядом с tap:

import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; class RawMulti extends StatefulWidget { const RawMulti({super.key}); @override State<RawMulti> createState() => _RawMultiState(); } class _RawMultiState extends State<RawMulti> { var label = '12345'; @override Widget build(BuildContext context) { return RawGestureDetector( gestures: { TapGestureRecognizer: GestureRecognizerFactoryWithHandlers< TapGestureRecognizer >( () => TapGestureRecognizer(), (TapGestureRecognizer instance) { instance.onTap = () { setState(() { label = 'tap'; }); }; }, ), LongPressGestureRecognizer: GestureRecognizerFactoryWithHandlers< LongPressGestureRecognizer >( () => LongPressGestureRecognizer(), (LongPressGestureRecognizer instance) { instance.onLongPress = () { setState(() { label = 'long'; }); }; }, ), }, child: Container( padding: const EdgeInsets.all(20), color: Colors.purple.shade100, child: Text(label), ), ); } } void main() { runApp( MaterialApp( home: Scaffold( body: Center( child: RawMulti(), ), ), ), ); }

На экране текст '12345'; короткое нажатие покажет 'tap', долгое - 'long'.

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

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