#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 или нет. Но тогда, возможно, я что-то неправильно понимаю, так как ваш аудиоплеер на самом деле не воспроизводит эту песню, он просто возобновляет то, что играл раньше.
Может быть, начните с простых шагов и сначала заставьте значок работать. Это должно быть возможно с помощью метода, о котором я упоминал выше: следите за тем, какая запись была выбрана.