我如何在迷你播放器中获得当前播放歌曲的详细信息?



我正在工作的音乐播放器应用程序在扑动。我使用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小部件,这样即使你导航到其他屏幕,迷你播放器也会在屏幕上,我以前遇到过这个问题,迷你播放器工作得很好,就像我预期的那样,我建议你使用它。

相关内容

  • 没有找到相关文章