我正在工作的音乐播放器应用程序在扑动。我使用on_audio_query包从设备获取歌曲,并在listview中显示它们。当我点击一首歌曲时,我会设置所有歌曲的plylist,并使用just_audio包像这样播放点击的歌曲。
await player.setAudioSource(
ConcatenatingAudioSource(
useLazyPreparation: true,
shuffleOrder: DefaultShuffleOrder(),
children: allSongsList! // allSongsList is the list of
songs(on_audio_query)
.map((songModel) =>
AudioSource.uri(Uri.parse(songModel.data)))
.toList(),
),
initialIndex: index, // Listview Index
initialPosition: Duration.zero);
await item.player.play();
我想在底部显示迷你播放器只有当有歌曲播放(暂停),刷新歌曲描述,我怎么得到歌曲描述(艺人/歌曲)?
我将让您为您实现迷你播放器小部件,但是,我会认为我有一个shouldMiniPlayerBeVisible
,在您的页面的Scaffold
:
首先,声明并初始化一个shouldMiniPlayerBeVisible
变量,它将管理迷你播放器的显示/隐藏:
bool shouldMiniPlayerBeVisible = false;
和一个currentAudio
,它将接收歌曲并在迷你播放器中传递。
YourAudioModel currentAudio = YourAudioModel();
在这里,我假设我有一个简单的YourAudioModel
,它将保存有关音频的信息,如标题,描述,长度,URL(或本地)路径…
我建议最初不要将其设置为null
,您可以使用占位符YourAudioModel
音频模型初始化它,该模型具有一些虚拟数据,或加载数据信息,例如…
现在在你的Scaffold中:
Scaffold(
floatingActionButton: Visibility(
visible: shouldMiniPlayerBeVisible,
child: shouldMiniPlayerBeVisible(songToPlay: currentAudio),
),
),
我将认为您正在使用StatefulWidget
,但步骤与您需要的相同,只是需要了解它的想法,以便在其他状态管理解决方案中实现它。
initState
中的,您需要像这样收听playerStateStream
流:
player.playerStateStream.listen((state) {
if (state.playing) {
shouldMiniPlayerBeVisible = true;
} else {
shouldMiniPlayerBeVisible = false;
}
setState(() {});
});
这基本上将跟踪是否有音频正在播放,然后显示基于它的迷你播放器。
现在在你运行await item.player.play();
之前,设置你的currentAudio
变量为正在运行的新音频,你可以这样做:
Future<void> playCurrentAudioANdShowItInMiniPlayer(YourAudioModel audio) async {
currentAudio = YourAudioModel;
await item.player.play();
}
现在从你的UI中,对于ListView
中的每个项目,你可以用YourAudioModel
调用playCurrentAudioANdShowItInMiniPlayer
方法,并期望它能正常工作。
从这里,你应该实现实际的迷你播放器小部件,你还需要一个自定义的Navigator
小部件,这样即使你导航到其他屏幕,迷你播放器也会在屏幕上,我以前遇到过这个问题,迷你播放器工作得很好,就像我预期的那样,我建议你使用它。