Виджет 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