Виджет AbsorbPointer
Виджет AbsorbPointer при absorbing: true
блокирует child и виджеты под ним.
Нажатия не проходят ни к child, ни сквозь AbsorbPointer вниз.
Если нужно пропустить событие ниже по дереву, берут
IgnorePointer.
Синтаксис
AbsorbPointer(
absorbing: true,
child: child,
)
Параметры
| Параметр | Описание |
|---|---|
absorbing |
Если true, события указателя не доходят до child и ниже. |
child |
Дочерний виджет под блокировкой. |
Пример
Давайте накроем экран блокировкой при загрузке:
import 'package:flutter/material.dart';
class LoadingShield extends StatefulWidget
{
const LoadingShield({super.key});
@override
State<LoadingShield> createState() => _LoadingShieldState();
}
class _LoadingShieldState extends State<LoadingShield>
{
var busy = true;
var label = 'abcde';
@override
Widget build(BuildContext context)
{
return Stack(
children: [
ElevatedButton(
onPressed: () {
setState(() {
label = '12345';
});
},
child: Text(label),
),
if (busy)
const AbsorbPointer(
absorbing: true,
child: ModalBarrier(dismissible: false),
),
if (busy)
const Center(
child: CircularProgressIndicator(),
),
],
);
}
}
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: LoadingShield(),
),
),
),
);
}
На экране кнопка под полупрозрачной пеленой; нажатия поглощает AbsorbPointer, текст не меняется.
Пример
Даже child внутри AbsorbPointer не получит onTap:
import 'package:flutter/material.dart';
class AbsorbChild extends StatefulWidget
{
const AbsorbChild({super.key});
@override
State<AbsorbChild> createState() => _AbsorbChildState();
}
class _AbsorbChildState extends State<AbsorbChild>
{
var label = '12345';
@override
Widget build(BuildContext context)
{
return AbsorbPointer(
absorbing: true,
child: GestureDetector(
onTap: () {
setState(() {
label = 'abcde';
});
},
child: Text(label),
),
);
}
}
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: AbsorbChild(),
),
),
),
);
}
На экране текст '12345'; нажатия не доходят до GestureDetector внутри AbsorbPointer.
Смотрите также
-
виджет
IgnorePointer,
который пропускает события к виджетам ниже -
виджет
GestureDetector,
который перестаёт работать под AbsorbPointer -
виджет
Listener,
который тоже не получит PointerEvent при absorbing -
виджет
InkWell,
который не покажет ripple под блокировкой