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.