Как мне добиться поведения, подобного onContinuousPress? - PullRequest
1 голос
/ 20 мая 2019

Допустим, у меня есть кнопка в приложении Flutter:

FloatingActionButton(
 backgroundColor: Theme.of(context).primaryColor,
 child: Icon(Icons.arrow_upward),
 onPressed: _someAction,
);

Я хочу, чтобы _someAction() будет выполняться, пока мой палец нажимает на кнопку (т.е. если я нажимаю непрерывно в течение T секунд _someAction() должно быть выполнено N раз ,

где N=(int)(60/T + 1))

Я посмотрел на GestureDetector но не смог найти то что мне нужно там. Мне это нужно, например, чтобы увеличить / уменьшить значение int ...

Ответы [ 2 ]

0 голосов
/ 20 мая 2019
int _value = 0;
Timer _timer;

Widget build(BuildContext context) {
  return GestureDetector(
    onTapDown: (details) => _startTimer(true),
    onTapUp: (details) => _startTimer(false),
    child: FlutterLogo(size: 200),
  );
}

void _startTimer(bool start) {
  if (!start) {
    _timer.cancel();
    return;
  }
  // you can adjust the timings here
  _timer = Timer.periodic(Duration(milliseconds: 1), (_) => _myMethod());
}

// this method will be getting called as long as you hold
void _myMethod() => print("value = ${++_value}");
0 голосов
/ 20 мая 2019

Используйте onTapDown и onTapUp из GestureDetector и Timer для достижения вашей цели.

GestureDetector

onTapDown: (_) => setState(() {
    _timerStart = true;
    _restartTimer();
}),
onTapUp: (_) => setState(() => _timerStart = false),

НекоторыеДействие

void _restartTimer() {
  _timer?.cancel();
  _timer = Timer(Duration(milliseconds: 100), () {
    // _someAction()
    if (_timerStart) {
        _restartTimer();
    }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...