flutter:: Есть ли способ воспроизвести только один аудиофайл с помощью пакета audioplayer?

#flutter #dart

#трепетать #дротик

Вопрос:

Я сохранил аудиофайлы в списке «файл». Я хочу воспроизвести этот аудиофайл с помощью пакета audioplayers. Я перечислил аудиофайлы с помощью listview, но я хочу воспроизвести только один выбранный аудиофайл из нескольких аудиофайлов. В настоящее время весь аудиофайл в записях воспроизводится одновременно, и произошла ошибка.
Как я могу это решить?

Это часть моего кода.

 class AudioViewer extends StatefulWidget {  @override  _AudioViewerState createState() =gt; _AudioViewerState(); }  class _AudioViewerState extends Statelt;AudioViewergt; {  List file = [];  var audioPath;  var directory;  AudioPlayer? audioPlayer;  bool _isplaying = false;  var _icon = Icons.play_arrow;  var _deleteicon = Icons.delete;  Color _color = Colors.deepOrangeAccent;  Duration position = Duration();  Duration duration = Duration(seconds: 1);   int indexindex = 0;   @override  void initState() {  super.initState();  getFiles();  _setupAudioPlayer();  }   void getFiles() async {  directory = (await getExternalStorageDirectory())!.path;  setState(() {  file = Directory("$directory").listSync();  });  print(file.toString());  }   @override  Widget build(BuildContext context) {  return Scaffold(  appBar: AppBar(  elevation: 0,  title: Text(  "Audio List",  ),  ),  body: Container(  child: ListView.builder(  reverse: true,  itemCount: widget.records.length,  shrinkWrap: true,  itemBuilder: (BuildContext context, int index) {  return Card(  elevation: 5,  child: ExpansionTile(  title: Text(  widget.records[index].path.split('/').last.split(".").first,  style: TextStyle(color: Colors.black),  ),  onExpansionChanged: ((newState) {  if (newState) {  indexindex = index;  setState(() {    });  }  }),  children: [  Container(  height: 100,  padding: EdgeInsets.fromLTRB(10,0,10,0),  child: Column(  children: lt;Widgetgt;[  Row(  children: lt;Widgetgt;[  Container(  child: IconButton(  iconSize: 40,  onPressed: () {  if (!_isplaying) {  audioPlayer!.resume();  setState(() {  _isplaying = true;  _icon = Icons.pause;  _color = Colors.blueGrey;   });  } else {  audioPlayer!.release();  setState(() {  position = new Duration();  _isplaying = false;  _icon = Icons.play_arrow;  _color = Colors.deepOrangeAccent;   });  }  },  icon: Icon(_icon),  color: _color,  ),  ),  Container(  child: IconButton(  iconSize: 30,  onPressed: () {  widget.records[index].delete(recursive: true);  setState(() {  widget.records.removeAt(index);  position = new Duration();  });  },  icon: Icon(_deleteicon),  ),  ),  ]  ),  

Ответ №1:

Похоже, у вас есть переменные состояния, как _isplaying только один раз для всей страницы/списка. Они нужны вам для каждой песни. Это, похоже, не полный пример ( widget.records кажется, отсутствует), поэтому я действительно не могу здесь помочь.

Что вы могли бы сделать, если widget.records бы содержали песни, так это иметь currentlyPlaying переменную, которая является записью, воспроизводимой в данный момент, а не просто общей _isplaying . Таким образом, вы могли бы выяснить, действительно ли воспроизводится запись списка сборки currectly или нет. Но тогда, возможно, я что-то неправильно понимаю, так как ваш аудиоплеер на самом деле не воспроизводит эту песню, он просто возобновляет то, что играл раньше.

Может быть, начните с простых шагов и сначала заставьте значок работать. Это должно быть возможно с помощью метода, о котором я упоминал выше: следите за тем, какая запись была выбрана.