Как динамически заполнять AudioSource несколькими аудиоданными из firestore в just_audio?

Я пытался динамически заполнить AudioSource.uri() данными из firestore.

Я загрузил несколько песен в базу данных firestore и хотел использовать данные для плейлиста just_audio в своем приложении. Я сделал все возможное, и я действительно не уверен, почему это не работает.

Я не хочу добавлять URL-адреса песен и другие данные статически, как показано в примере с плагином.

Вот мои попытки:

Сначала я получил данные песни с помощью 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'))),
                    );
                  }),
            )


Затем вот страница JustAudioPlaylist, на которой я ожидал получить и заполнить AudioSource.uri().

      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 был вызван при нулевом значении». Пожалуйста, может кто-нибудь помочь?

1 ответ

Ваш соответствующий код:

      _playlist.addAll(...);

Значит ошибка есть. То есть это неинициализированная переменная, фактически не содержащая никаких объектов списка воспроизведения. Я вижу, вы объявляете переменную, поэтому она начинается с нуля:

      var _playlist;

Но на самом деле вы никогда ничего не храните в этой переменной, например _playlist = ...something.... Так что ваши _playlist переменная начинается и продолжает оставаться null.

Вместо этого вы можете сделать это:

      _playlist = ConcatenatingAudioSource(children: []);

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

Хотя addAllпредназначен для динамического изменения списка воспроизведения после того, как он уже создан. Но в вашем случае вы знаете, какие песни вы хотите воспроизвести во время инициализации, поэтому вы можете просто инициализировать список воспроизведения в самом начале, и вам не придется добавлять его позже:

      _playlist = ConcatenatingAudioSource(
  children: widget.songs.map(...etc...)
);
Другие вопросы по тегам