Flutter - звук воспроизводится только один раз, когда я захожу на главную страницу Piano.

Я делаю приложение для фортепиано как новичок для демонстрации. Я сделал целую страницу для фортепиано, включая пользовательский интерфейс и аудио. Но проблема в том, что когда я открываюPianoMainИтак, он воспроизводит любой звук ключа. Тогда, если я нажму любую клавишуonTapэто не работает. Итак, позвольте мне разместить здесь мой код. И, пожалуйста, проверьте, можете ли вы найти какую-либо мою ошибку.

      AudioPlayer player = AudioPlayer();

  void playAudio({required String fileName}) {
    player.play(AssetSource(fileName));
  }

Пакет это:import 'package:audioplayers/audioplayers.dart';

      @override
  void dispose() async {
    super.dispose();
    await player.stop();
  }
      Row(
            children: [
              PianoButtonSuperKey(
                keyPress: () {
                  playAudio(fileName: "piano/piano3.mp3");
                },
              ),
              PianoButton(
                onSuperKeyPress: () {
                  playAudio(fileName: "piano/blackpiano1.mp3");
                },
                onMainKeyPress: () {
                  playAudio(fileName: "piano/piano4.mp3");
                },
              ),
              PianoButtonSuperKey(
                keyPress: () {
                  playAudio(fileName: "piano/piano5.mp3");
                },
              ),
              PianoButton(
                onSuperKeyPress: () {
                  playAudio(fileName: "piano/hard7.mp3");
                },
                onMainKeyPress: () {
                  playAudio(fileName: "piano/piano10.mp3");
                },
              ),
              PianoButton(
                onSuperKeyPress: () {
                  playAudio(fileName: "piano/hardpiano8.mp3");
                },
                onMainKeyPress: () {
                  playAudio(fileName: "piano/audio6.mp3");
                },
              ),
            ],
          ),
      class PianoButton extends StatelessWidget {
  const PianoButton(
      {super.key, required this.onMainKeyPress, required this.onSuperKeyPress});
  final Function onMainKeyPress;
  final Function onSuperKeyPress;

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: 1,
      child: Stack(
        clipBehavior: Clip.none,
        children: [
          Container(
            height: double.infinity,
            width: double.infinity,
            padding: const EdgeInsets.only(right: 8, bottom: 2, top: 2),
            child: GestureDetector(
              onTap: onMainKeyPress(),
              child: Container(
                decoration: const BoxDecoration(
                    color: Colors.white, boxShadow: [BoxShadow(blurRadius: 2)]),
              ),
            ),
          ),
          Positioned(
              top: 2,
              right: 98,
              child: SizedBox(
                width: 50,
                height: 200,
                child: GestureDetector(
                  onTap: onSuperKeyPress(),
                  child: Container(
                    decoration: const BoxDecoration(color: Colors.black),
                  ),
                ),
        ],
      ),
    );
  }
}
      class PianoButtonSuperKey extends StatelessWidget {
  const PianoButtonSuperKey({super.key, required this.keyPress});
  final Function keyPress;

  @override
  Widget build(BuildContext context) {
    return Expanded(
      flex: 1,
      child: Container(
        height: double.infinity,
        width: double.infinity,
        padding: const EdgeInsets.only(right: 8, bottom: 2, top: 2),
        child: GestureDetector(
          onTap: keyPress(),
          child: Container(
            decoration: const BoxDecoration(
                color: Colors.white, boxShadow: [BoxShadow(blurRadius: 2)]),
          ),
        ),
      ),
    );
  }
}

Надеюсь, мне удалось очиститься.

1 ответ

Похоже, вы вызываете функции onMainKeyPress и onSuperKeyPress с помощью () в методе onTap вашего GestureDetector. Это приводит к тому, что функции выполняются немедленно при создании виджета, а не при нажатии на него.

Чтобы это исправить, вы можете удалить () при вызове функций в методе onTap вашего GestureDetector. Например, измените onTap: onMainKeyPress() на onTap: onMainKeyPress. Аналогичным образом измените onTap: onSuperKeyPress() на onTap: onSuperKeyPress.

Другие вопросы по тегам