首页 > 解决方案 > 如何在just_audio中使用来自firestore的多个音频数据动态填充AudioSource?

问题描述

我一直在尝试使用来自 firestore 的数据动态填充 AudioSource.uri()。

我将一些歌曲上传到 firestore 数据库,我想在我的应用程序中将这些数据用于 just_audio 播放列表。我已尽一切可能,我真的不确定为什么它不起作用。

我不想像插件示例中所示静态添加歌曲网址和其他数据。

这是我的尝试:

首先,我使用 StreamBuilder 获取歌曲数据并将其作为 DocumentSnapshot 列表传递给 JustAudioPlaylist() 页面;

List<DocumentSnapshot> _list;
_list = snapshot.data.docs;

Flexible(
              child: ListView.builder(
                  itemCount: 1,
                  itemBuilder: (BuildContext context, int index) {
                    return InkWell(
                      onTap: () {
                        Navigator.push(
                            context,
                            MaterialPageRoute(
                              builder: (context) => JustAudioPlaylist(
                                songs: [_list[index]],
                                
                              ),
                            ));
                      },
                      child:
                          Container(child: Center(child: Text('My Playlists'))),
                    );
                  }),
            )


然后,这是我希望检索和填充 AudioSource.uri() 的 JustAudioPlaylist 页面。

class JustAudioPlaylist extends StatefulWidget {
  final List songs;

  JustAudioPlaylist({this.songs});
  @override
  _JustAudioPlaylistState createState() => _JustAudioPlaylistState();
}

class _JustAudioPlaylistState extends State<JustAudioPlaylist> {
  AudioPlayer _player;
  int _addedCount = 0;
  var _playlist;
  @override
  void initState() {
    _playlist
        .addAll(widget.songs.map((song) => ConcatenatingAudioSource(children: [
              AudioSource.uri(
                Uri.parse(song['song']),
                tag: AudioMetadata(
                  album: "Science Friday",
                  title: song['songTitle'],
                  artwork: song['songImage'],
                ),
              ),
            ]))); 

我不确定为什么它不起作用,但它会产生错误“addAll was called on null”。请问有人可以帮忙吗?

标签: just-audio

解决方案


您的相关代码是:

_playlist.addAll(...);

错误的意思_playlistnull。也就是说,_playlist是一个未初始化的变量,实际上不包含任何播放列表对象。我可以看到您声明了变量,因此它开始为空:

var _playlist;

但是你从来没有真正将任何东西存储到这个变量中,比如_playlist = ...something.... 所以你的_playlist变量开始null并继续保持null

你可以这样做:

_playlist = ConcatenatingAudioSource(children: []);

// and then later...
_playlist.addAll(widget.songs.map(...etc...));

虽然addAll旨在在播放列表创建后动态修改它。但是在您的情况下,您知道要在初始化时播放哪些歌曲,因此您不妨一开始就初始化播放列表,以后不必添加:

_playlist = ConcatenatingAudioSource(
  children: widget.songs.map(...etc...)
);

推荐阅读