Flutter Execute Method, пока нажата кнопка

Мне нужно выполнить метод, когда пользователь нажимает кнопку и во время этой операции нажатия, другими словами, пользователь будет нажимать кнопку в течение неизвестного периода времени, и мне нужно выполнить метод в течение этого периода времени, у любого есть идея, как я могу это сделать в Flutter Я попробовал GestureDetector, но у него нет возможности сделать это, также у onLongPress нет этой опции, потому что при длительном нажатии, срабатывающем после нажатия Operation, я напишу psudo-код для того, что мне нужно:

While(Button.isPressed){
 //Execute Method
 }

person DoctorDoom    schedule 01.09.2018    source источник
comment
так что не так с GestureLongPressCallback onLongPress собственностью?   -  person pskink    schedule 01.09.2018
comment
Проблема в том, что onLongPress был запущен после операции нажатия, но мне нужно во время операции нажатия   -  person DoctorDoom    schedule 01.09.2018
comment
в этом мало смысла: если вы просто сделаете обычное быстрое нажатие (то есть вы быстро отпустите палец), как тогда вы сможете получить длинный щелчок?   -  person pskink    schedule 01.09.2018
comment
Именно то, что мне нужно, метод будет выполняться так долго, что палец на кнопке   -  person DoctorDoom    schedule 01.09.2018
comment
Идея касается кнопки форварда в музыкальном проигрывателе, и мне нужно искать форвард песни, когда пользователь нажимает кнопку   -  person DoctorDoom    schedule 01.09.2018
comment
предисловие? ты имеешь ввиду вперед? хотя я все еще не понимаю того, чего вы действительно хотите достичь ...   -  person pskink    schedule 01.09.2018
comment
Позвольте нам продолжить это обсуждение в чате.   -  person DoctorDoom    schedule 01.09.2018


Ответы (2)


Используйте Listener и виджет с отслеживанием состояния. Я также ввел небольшую задержку после каждого цикла:

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(brightness: Brightness.dark),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  bool _buttonPressed = false;
  bool _loopActive = false;

  void _increaseCounterWhilePressed() async {
    // make sure that only one loop is active
    if (_loopActive) return;

    _loopActive = true;

    while (_buttonPressed) {
      // do your thing
      setState(() {
        _counter++;
      });

      // wait a bit
      await Future.delayed(Duration(milliseconds: 200));
    }

    _loopActive = false;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Listener(
          onPointerDown: (details) {
            _buttonPressed = true;
            _increaseCounterWhilePressed();
          },
          onPointerUp: (details) {
            _buttonPressed = false;
          },
          child: Container(
            decoration: BoxDecoration(color: Colors.orange, border: Border.all()),
            padding: EdgeInsets.all(16.0),
            child: Text('Value: $_counter'),
          ),
        ),
      ),
    );
  }
}
person boformer    schedule 01.09.2018
comment
Это именно то, что мне нужно - person DoctorDoom; 02.09.2018
comment
Пожалуйста, также обращайтесь с onPointerCancel;) - person boformer; 02.09.2018

Более простой способ без слушателя выглядит следующим образом:

  GestureDetector(
      child: InkWell(
        child: Icon(Icons.skip_previous_rounded),
        onTap: widget.onPrevious,
      ),
      onLongPressStart: (_) async {
        isPressed = true;
        do {
          print('long pressing'); // for testing
          await Future.delayed(Duration(seconds: 1));
        } while (isPressed);
      },
      onLongPressEnd: (_) => setState(() => isPressed = false),
    );
  }
person ThinkDigital    schedule 09.11.2020