Виджет IgnorePointer
Виджет IgnorePointer оборачивает child
и при ignoring: true
не передаёт нажатия вниз по дереву.
События проходят к виджетам под IgnorePointer.
Чтобы забрать нажатия себе, используют
AbsorbPointer.
Синтаксис
IgnorePointer(
ignoring: true,
child: child,
)
Параметры
| Параметр | Описание |
|---|---|
ignoring |
Если true, дочерние виджеты не получают события указателя. |
child |
Дочерний виджет, для которого отключают или включают события. |
Пример
Давайте заблокируем кнопку поверх другой:
import 'package:flutter/material.dart';
class BlockedButton extends StatefulWidget
{
const BlockedButton({super.key});
@override
State<BlockedButton> createState() => _BlockedButtonState();
}
class _BlockedButtonState extends State<BlockedButton>
{
var label = 'abcde';
@override
Widget build(BuildContext context)
{
return Stack(
alignment: Alignment.center,
children: [
ElevatedButton(
onPressed: () {
setState(() {
label = '12345';
});
},
child: const Text('bottom'),
),
IgnorePointer(
ignoring: true,
child: ElevatedButton(
onPressed: () {},
child: const Text('top'),
),
),
Text(label),
],
);
}
}
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: BlockedButton(),
),
),
),
);
}
На экране верхняя кнопка не ловит нажатия; клик проходит к нижней и меняет подпись на '12345'.
Пример
Давайте включим блокировку переключателем:
import 'package:flutter/material.dart';
class ToggleIgnore extends StatefulWidget
{
const ToggleIgnore({super.key});
@override
State<ToggleIgnore> createState() => _ToggleIgnoreState();
}
class _ToggleIgnoreState extends State<ToggleIgnore>
{
var blocked = true;
var taps = 0;
@override
Widget build(BuildContext context)
{
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Switch(
value: blocked,
onChanged: (value) {
setState(() {
blocked = value;
});
},
),
IgnorePointer(
ignoring: blocked,
child: ElevatedButton(
onPressed: () {
setState(() {
taps += 1;
});
},
child: Text('taps: $taps'),
),
),
],
);
}
}
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: ToggleIgnore(),
),
),
);
}
На экране переключатель; пока он включён, кнопка не реагирует, счётчик taps не растёт.
Смотрите также
-
виджет
AbsorbPointer,
который забирает нажатия и не отдаёт ниже -
виджет
GestureDetector,
который ловит жесты, когда ignoring выключен -
виджет
Listener,
который слушает PointerEvent -
перечисление
HitTestBehavior,
которое настраивает попадание указателя