Flutter Web应用使用just_audio包播放列表无法播放问题求助
解决just_audio循环播放无声音的问题
核心问题分析
你的代码存在两个关键错误导致无声音:
AudioPlayer是initState内的局部变量,方法执行完毕后会被垃圾回收,播放器实例无法持续存在。- 调用顺序错误:先调用
player.play()再设置音频源,此时播放器没有可播放内容;且设置音频源是异步操作,同步调用play不会生效。
修正后的代码
class MyGame extends StatefulWidget { const MyGame({Key? key}) : super(key: key); @override State<StatefulWidget> createState() { return MyGameState(); } } class MyGameState extends State<MyGame> { // 将AudioPlayer改为类成员变量,避免被回收 late AudioPlayer _player; @override void initState() { super.initState(); _initAudioPlayer(); WidgetsBinding.instance.addPostFrameCallback((_) { setState(() { currentState = 0; dynamicTextA1 = "start"; dynamicTextA2 = "da"; dynamicTextB1 = "adw"; dynamicTextB2 = "settings"; }); }); } // 单独封装音频初始化逻辑,处理异步操作 void _initAudioPlayer() async { _player = AudioPlayer(); // 先设置音量 await _player.setVolume(1); // 创建播放列表 final playlist = ConcatenatingAudioSource( useLazyPreparation: true, shuffleOrder: DefaultShuffleOrder(), children: [ AudioSource.asset('assets/music/digitalIgnition.mp3'), AudioSource.asset('assets/music/spunky.mp3'), AudioSource.asset('assets/music/jazzyNYC.mp3'), ], ); // 设置音频源,等待初始化完成 await _player.setAudioSource( playlist, initialIndex: 0, initialPosition: Duration.zero, ); // 设置循环模式 await _player.setLoopMode(LoopMode.all); // 最后启动播放 await _player.play(); // 可选:监听播放状态,方便排查问题 _player.playbackEventStream.listen((event) { print("播放状态:${event.processingState}"); print("当前曲目索引:${event.currentIndex}"); }); } @override void dispose() { // 页面销毁时释放播放器资源,避免内存泄漏 _player.dispose(); super.dispose(); } }
额外检查项
- 确认
pubspec.yaml已正确声明音频资源路径:assets: - assets/music/ - Android平台:若需要后台播放或网络音频,在
AndroidManifest.xml添加对应权限:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> - iOS平台:若需要后台播放,在
Info.plist中添加配置:<key>UIBackgroundModes</key> <array> <string>audio</string> </array>
内容的提问来源于stack exchange,提问作者fararjeh
相关产品推荐
相关产品推荐

