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

Flutter使用just_audio实现播放时动态添加歌曲到播放列表

Flutter just_audio播放过程中动态新增歌曲到队列解决方案

问题背景

应用支持将音频文件下载到设备本地,内置播放器可播放本地音频。使用just_audio: ^0.9.7开发时,原有实现仅支持应用启动初始化时加载本地音频列表,无法在音频播放过程中,将新下载的歌曲动态添加到播放队列。

原有实现问题根因

原有初始化逻辑中,仅在initState阶段临时创建ConcatenatingAudioSource实例传入播放器,没有保留该实例的全局引用,也没有维护可动态修改的音频源列表,后续无法对已加载的播放队列做修改操作,只能重启应用重新加载全量歌曲。

解决方案

全局维护ConcatenatingAudioSource实例,利用其自带的动态修改方法实现队列更新,无需中断当前播放。

步骤1:定义全局可访问的播放列表实例

在全局可访问的位置(如MainScreen类中)定义播放列表实例:

late ConcatenatingAudioSource audioPlaylist;

步骤2:修改初始化逻辑

调整原有的播放器初始化方法,用全局实例接收创建的播放列表:

Future<List<AudioSource>> _getList(List<SongModel> something) async {
  List<AudioSource> _list = [];
  for (var element in something) {
    _list.add(
      AudioSource.uri(
        Uri.directory(element.data.toString()),
        tag: MediaItem(
          id: element.id.toString(),
          title: element.title.toString(),
        ),
      ),
    );
    print(element.data);
  }
  return _list;
}

Future<void> settingAudioPlayer() async {
  List<SongModel> something = [];
  something = await OnAudioQuery().querySongs(sortType: SongSortType.DATA_ADDED);
  something.removeWhere((element) => !element.data.contains('StrikleDustiness'));
  var items = await _getList(something);
  // 初始化全局播放列表
  audioPlaylist = ConcatenatingAudioSource(useLazyPreparation: true, children: items);
  await MainScreen.player.setAudioSource(audioPlaylist);
}

步骤3:新增动态插入歌曲的方法

新歌曲下载完成后,调用以下方法即可动态加入队列:

// 追加新歌曲到队列末尾
Future<void> appendSongToPlaylist(SongModel newSong) async {
  final newAudioSource = AudioSource.uri(
    Uri.directory(newSong.data.toString()),
    tag: MediaItem(
      id: newSong.id.toString(),
      title: newSong.title.toString(),
    ),
  );
  await audioPlaylist.add(newAudioSource);
}

// 插入新歌曲到当前播放的下一首位置
Future<void> insertToNextPlay(SongModel newSong) async {
  final newAudioSource = AudioSource.uri(
    Uri.directory(newSong.data.toString()),
    tag: MediaItem(
      id: newSong.id.toString(),
      title: newSong.title.toString(),
    ),
  );
  final currentIndex = MainScreen.player.currentIndex ?? 0;
  await audioPlaylist.insert(currentIndex + 1, newAudioSource);
}

方案效果

  • 不会中断当前正在播放的音频,队列修改实时生效
  • 无需重新加载全量列表,资源消耗更低
  • 支持灵活控制新增歌曲的插入位置,满足不同业务需求

内容的提问来源于stack exchange,提问作者Aashish Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:42:03