#dart #flutter
#дротик #флаттер
Вопрос:
У меня есть GestureDetector
в пользовательском представлении без состояния. при onTap
срабатывании я показываю панель закусок, в которой отображается некоторая информация. Когда пользователь быстро нажимает несколько раз, он продолжает отображать панель закусок навсегда.
GestureDetector(
onTap: () {
Clipboard.setData(new ClipboardData(text: idText));
Scaffold.of(context).showSnackBar(SnackBar
(content: Text('ID copied')));
},
child: Icon(Icons.content_copy,),
}
Я хочу отключить onTap
на несколько секунд, прежде чем его можно будет щелкнуть снова.
Ответ №1:
Создайте bool
флаг и определите метод:
bool _enabled = true;
void _onTap () {
// Disable GestureDetector's 'onTap' property.
setState(() => _enabled = false);
// Enable it after 1s.
Timer(Duration(seconds: 1), () => setState(() => _enabled = true));
// Rest of your code...
}
Использование:
GestureDetector(
onTap: _enabled ? _onTap: null,
child: Icon(Icons.content_copy),
)
Ответ №2:
Оберните это в AbsorbPointer
var shouldAbsorb = true;
AbsorbPointer(
absorbing: shouldAbsorb,
child: GestureDetector(
onTap: () {
Navigator.of(context).pop();
},
child: Container(
color: Colors.red,
),
),
)
Ответ №3:
Лично я использую два других метода из GestureDetector
:
onTapDown
: Когда пользователь нажимает на ваш виджет.
onTapUp
: Когда пользователь покидает виджет.
onTap
: Это когда следует нажать вниз и нажать вверх. Если пользователь слишком сильно трепещет пальцем, воспринимайте это как нажатие отмены.
onTapCancel
: При отмене пользователем.
bool pressing = false;
GestureDetector(
// when user is pressing
onTapDown: (details) {
setState(() {
pressing = true;
});
},
// when user leaved
onTapUp: (details) {
setState(() {
pressing = false;
});
},
// when user leaved
onTapCancel: () {
setState(() {
pressing = false;
});
}
// the action to do when user tap
onTap: () {
// code...
}
);
Вот документация: Документация Flutter GestureDetector
Ответ №4:
В дополнение к ответу CopsOnRoad
Это можно сделать и в будущем
setState(() => _enabled = true);
await Future.delayed(Duration(seconds: 1));
setState(() => _enabled = false);