提问人:faisal 提问时间:8/31/2023 最后编辑:faisal 更新时间:9/8/2023 访问量:88
Flutter 移动到另一个字母时停止字母的声音
Flutter Stop the letter sound when moving to another letter
问:
如果用户没有等待听到 字母的声音 他快速地在按钮之间移动 声音之间有重叠, 所有的声音都仍然存在. 在应用程序的后台 如何纠正或解决问题?完整代码
https://github.com/Saleque474/Learn-Alphabet
dependencies : kplayer: ^0.2.4
class _HomeState extends State<Home> {
String currentAlphabet = "A";
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.amber[200],
body: LayoutBuilder(builder: (context, constraints) {
var height = constraints.maxHeight;
var width = constraints.maxWidth;
return Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
sentenceHolder(height, width),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
imageHolder(height, width),
wordHolder(height, width),
],
),
Container(
decoration:
BoxDecoration(borderRadius: BorderRadius.circular(15)),
child: Wrap(
children: changePos(),
),
),
],
);
}),
);
}
playAudio(String path) {
Player.asset(path).play();
}
List<Widget> changePos() {
List<Widget> children = [
...alphabets
.map(
(e) => textHolder(e),
)
.toList()
];
return children;
}
Widget textHolder(String alphabet) {
return Padding(
padding: const EdgeInsets.all(7),
child: ElevatedButton(
onPressed: () {
currentAlphabet = alphabet;
playAudio("assets/audio/$alphabet.wav");
setState(() {});
},
child: Text(alphabet),
),
);
}
// 当调用字母时,声音是一个函数
它正常工作,但是如果我们在字母按钮之间快速移动,我们会注意到所有声音同时协同工作 //
答:
0赞
Jatinder Verma
8/31/2023
#1
一个简单的解决方案是: 在调用 play() 之前停止已经播放的歌曲/声音
评论
0赞
faisal
9/1/2023
试过了,但没有用
0赞
Khaled Sayed
9/3/2023
#2
您可以通过以下 3 个步骤处理这种情况:
1- 从玩家类创建一个公共对象(可为空) 确保在方法 playAudio 之外声明它; 选手?公共播放器;
2- 在播放声音之前,请确保停止旧声音
if(publicPlayer != null) publicPlayer.stop();
3- 而不是调用 Player.asset(path).play(); 分配 publicPlayer 后调用;
publicPlayer = Player.asset(路径); publicPlayer.play();
评论
0赞
faisal
9/4/2023
drive.google.com/file/d/1OZG63KmVtvv3UfqqOflXgLK32OH1SSTa/......
0赞
faisal
9/4/2023
drive.google.com/file/d/1SqtFV8eKMtfXfBwbp5oKhkcXcatHPaiP/......
0赞
Khaled Sayed
9/4/2023
你调用方法没有 () .stop();不是 .stop;
0赞
faisal
9/4/2023
目前我使用此解决方案 drive.google.com/file/d/1YJ-dXxtpLVWuY1M2kpzriHwhQbCHUDt1/,但目前不起作用......
0赞
faisal
9/8/2023
#3
class _HomeState extends State<Home> {
AudioPlayer _audioPlayer;
@override
void initState() {
_audioPlayer = AudioPlayer();
// TODO: implement initState
super.initState();
}
@override
void dispose() {
// _audioPlayer.dispose();
super.dispose();
}
void _playAudio(String assetPath) async {
_audioPlayer.pause();
assetPath = ("assets/audio/$currentAlphabet.mp3");
try {
await _audioPlayer.setAsset(assetPath);
_audioPlayer.play();
} catch (e) {
debugPrint("Error loading audio source: $e");
}
}}
我使用just_audio解决了这个问题:
评论