Флаттер: как отключить onTap на некоторое время в детекторе жестов?

#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);