Как динамически заполнять 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...)
);