#flutter #dart
#флаттер #dart
Вопрос:
import 'package:audioplayers/audioplayers.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class AudioViewer extends StatefulWidget {
@override
_AudioViewerState createState() => _AudioViewerState();
}
class _AudioViewerState extends State<AudioViewer> {
List file = [];
var audioPath;
var directory;
late 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) {
var height = MediaQuery.of(context).size.height;
var width = MediaQuery.of(context).size.width;
return Scaffold(
appBar: AppBar(
elevation: 0,
title: Text(
"Audio List",
),
),
body: Container(
child: ListView.builder(
reverse: true,
itemCount: file.length,
itemBuilder: (BuildContext context, int index) {
return Card(
elevation: 5,
child: ExpansionTile(
title: Text(
'Record ${index}',
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: <Widget>[
Container(
child: Row(
children: <Widget>[
Container(
child: IconButton(
iconSize: 40,
onPressed: () {
if (!_isplaying) {
_play();
} else {
_stop();
}
},
icon: Icon(_icon),
color: _color,
),
),
Container(
child: IconButton(
iconSize: 30,
onPressed: () {
file[index].delete(recursive: true);
setState(() {
file.removeAt(index);
position = new Duration();
});
},
icon: Icon(_deleteicon),
),
),
]
)
),
Padding(
padding: const EdgeInsets.all(8.0),
child: LinearProgressIndicator(
backgroundColor: Colors.grey[300],
valueColor: AlwaysStoppedAnimation(Colors.deepOrangeAccent),
value: (position.inMilliseconds / duration.inMilliseconds) * 1.0,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
_getDuration(position),
style: TextStyle(color: Colors.black),
),
Text(
_getDuration(duration),
style: TextStyle(color: Colors.black),
)
],
),
)
],
),
)
]
)
);
},
),
),
);
}
String _getDuration(Duration duration) {
String twoDigits(int n) {
if (n >= 10) return "$n";
return "0$n";
}
String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
return "${twoDigits(duration.inHours)}:$twoDigitMinutes:$twoDigitSeconds";
}
_play() {
audioPlayer.resume();
setState(() {
_isplaying = true;
_icon = Icons.pause;
_color = Colors.blueGrey;
});
}
_stop() {
audioPlayer.release();
setState(() {
position = new Duration();
_isplaying = false;
_icon = Icons.play_arrow;
_color = Colors.deepOrangeAccent;
});
}
_stateListener(PlayerState state) {
print(" In _stateListener the state of AudioPlayer :- "
state.toString()
"n");
if (state == PlayerState.COMPLETED) {
//Navigator.pop(context);
_stop();
}
}
_setupAudioPlayer() async {
position = new Duration(seconds: 0);
audioPlayer = AudioPlayer();
await audioPlayer.setUrl(file[indexindex].path.toString());
await audioPlayer.setReleaseMode(ReleaseMode.STOP);
audioPlayer.onAudioPositionChanged.listen((Duration p) {
print('Current position: $p');
setState(() => position = p);
});
audioPlayer.onDurationChanged.listen((Duration d) {
print('Max duration: $d');
setState(() => duration = d);
});
audioPlayer.onPlayerStateChanged.listen(_stateListener);
}
}
Я создал функцию для записи голоса и воспроизведения / удаления записанных файлов. Я использовал пакет audioplayers для создания функции для воспроизведения файлов записи.
Кнопка удаления работает нормально. Но когда я нажимаю кнопку воспроизведения, записанный файл не воспроизводится, и возникает следующая ошибка.
E/flutter (17278): [ОШИБКА: flutter/lib/ui/ui_dart_state.cc(209)] Необработанное исключение: исключение PlatformException(неожиданная ошибка!, uriString, java.lang.Исключение NullPointerException: исключение uriString
Как я могу это решить?
Комментарии:
1. Вы объявили
audioPlayer
aslate
, но вы создаете его в асинхронной функции_setupAudioPlayer
. Играя с огнем, нет никакой гарантии, что он будет инициализирован к моменту его использования. Я бы предпочел сделать его обнуляемым и проверять наличие null при каждом использовании… таким образом, вы можете пропустить попытки использовать его, пока он не инициализирован.2. Я удалил поздно и выполнил нулевую проверку, но та же ошибка все еще возникает.
3. Не видя полной трассировки стека, я не уверен, откуда это происходит, но это явно ошибка библиотеки Java … я предполагаю, что она исходит из пакета player, попробуйте заполнить проблему с ними: github.com/bluefireteam/audioplayers/issues