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
相关产品推荐
相关产品推荐

