You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web应用使用just_audio包播放列表无法播放问题求助

解决just_audio循环播放无声音的问题

核心问题分析

你的代码存在两个关键错误导致无声音:

  1. AudioPlayer是initState内的局部变量,方法执行完毕后会被垃圾回收,播放器实例无法持续存在。
  2. 调用顺序错误:先调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:25:22