Как перестать вызывать существующую функцию (flutter_midi) при вызове новой функции - PullRequest
0 голосов
/ 03 марта 2020

Я делаю аккорд-приложение, которое помогает изучить теорию музыки c. Для игры аккордов я использую библиотеку flutter_midi (https://github.com/rodydavis/flutter_midi/tree/master/flutter_midi).

final _flutterMidi = FlutterMidi();

  @override
  void initState() {
    load('assets/piano.SF2');
    super.initState();
  }

  void load(String asset) async {
    _flutterMidi.unmute(); // Optionally Unmute
    ByteData _byte = await rootBundle.load(asset);
    _flutterMidi.prepare(sf2: _byte);
  }

  void _play(int midi) {
    _flutterMidi.playMidiNote(midi: midi);
  }

И у меня есть 4 кнопки, которые

void _chordplay(List<int> list) {
    list.forEach((x) {
      _play(x);
    });
  }


void _chordplay_two_outputs() {
    _chordplay([60, 64, 67, 71]);
Future.delayed(const Duration(milliseconds: 1200), () {
        _chordplay([62, 66, 69]);
Future.delayed(const Duration(milliseconds: 1200), () {
        _chordplay([67, 71, 74]);
  }
////////////////////////////////////////

Widget chordC(String buttonText) {
    return Expanded(
      child: FlatButton(
            child: Text(
          "C",
          style: TextStyle(fontSize: 18.0, color: Colors.grey),
        ),
        onPressed: () => _chordplay([60, 64, 67, 71]),
      ),
    );
  }

Widget chordDm(String buttonText) {
    return Expanded(
      child: FlatButton(
            child: Text(
          "Dm",
          style: TextStyle(fontSize: 18.0, color: Colors.grey),
        ),
        onPressed: () => _chordplay([62, 66, 69]),
      ),
    );
  }

Widget chordG(String buttonText) {
    return Expanded(
      child: FlatButton(
            child: Text(
          "G",
          style: TextStyle(fontSize: 18.0, color: Colors.grey),
        ),
        onPressed: () => _chordplay([67, 71, 74]),
      ),
    );
  }

Widget playAll(String buttonText) {
    return Expanded(
      child: FlatButton(
            child: Text(
          "playAll",
          style: TextStyle(fontSize: 18.0, color: Colors.grey),
        ),
        onPressed: () => _chordplay([67, 71, 74]),
      ),
    );
  }

Работает хорошо.

Нажатие каждой кнопки аккордов (C, Dm, G) воспроизводит аккорды (миди). нажатие PlayAll воспроизводит каждый аккорд в последовательности.

Но я хочу решить следующее: если я нажму кнопку playAll и сразу же нажму кнопку C, я ожидаю, что функция playAll остановится. Но он будет работать одновременно.

Аналогичным образом, если я нажму кнопку Dm и сразу же нажму кнопку playAll, я хочу прекратить воспроизведение функции C chord.

Можно ли прекратить вызов существующего функция при вызове новой функции? Буду признателен, если вы поможете мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...