![](/img/trans.png)
[英]flutter: Unhandled Exception: Bad state: Cannot add new events after calling close
[英]Unhandled Exception: Bad state: Cannot add new events after calling close Audio player
對於我的應用程序,我使用 package 音頻播放器( https://pub.dev/packages/audioplayers ),當我從有狀態小部件啟動音頻和 go 時出現問題,我有這樣的錯誤:未處理的異常:錯誤 state:無法添加新的調用關閉后的事件以及當我返回 go 時我的音頻丟失但我無法停止音頻。 而且我不知道該怎么辦,有人可以幫助我。
enum PlayerState { stopped, playing, paused }
enum PlayingRouteState { speakers, earpiece }
class PlayerWidget extends StatefulWidget {
final String url;
final PlayerMode mode;
PlayerWidget({this.url, this.mode = PlayerMode.MEDIA_PLAYER});
@override
State<StatefulWidget> createState() {
return _PlayerWidgetState(url, mode);
}
}
class _PlayerWidgetState extends State<PlayerWidget> {
//audio player
String url;
PlayerMode mode;
AudioPlayer _audioPlayer;
AudioPlayerState _audioPlayerState;
Duration _duration;
Duration _position;
PlayerState _playerState = PlayerState.stopped;
PlayingRouteState _playingRouteState = PlayingRouteState.speakers;
StreamSubscription _durationSubscription;
StreamSubscription _positionSubscription;
StreamSubscription _playerCompleteSubscription;
StreamSubscription _playerErrorSubscription;
StreamSubscription _playerStateSubscription;
get _isPlaying => _playerState == PlayerState.playing;
get _isPaused => _playerState == PlayerState.paused;
get _durationText => _duration?.toString()?.split('.')?.first ?? '';
get _positionText => _position?.toString()?.split('.')?.first ?? '';
_PlayerWidgetState(this.url this.mode);
@override
void initState() {
super.initState();
_initAudioPlayer();
}
@override
void dispose() async {
_audioPlayer.dispose();
_durationSubscription?.cancel();
_positionSubscription?.cancel();
_playerCompleteSubscription?.cancel();
_playerErrorSubscription?.cancel();
_playerStateSubscription?.cancel();
super.dispose();
}
void _initAudioPlayer() {
_audioPlayer = AudioPlayer(mode: mode);
_durationSubscription = _audioPlayer.onDurationChanged.listen((duration) {
setState(() => _duration = duration);
if (Theme.of(context).platform == TargetPlatform.iOS) {
_audioPlayer.startHeadlessService();
_audioPlayer.setNotification(
title: name,
artist: author,
imageUrl: 'url',
forwardSkipInterval: const Duration(seconds: 30), // default is 30s
backwardSkipInterval: const Duration(seconds: 30), // default is 30s
duration: duration,
elapsedTime: Duration(seconds: 0));
}
});
_positionSubscription =
_audioPlayer.onAudioPositionChanged.listen((p) => setState(() {
_position = p;
}));
_playerCompleteSubscription =
_audioPlayer.onPlayerCompletion.listen((event) {
_onComplete();
setState(() {
_position = _duration;
});
});
_playerErrorSubscription = _audioPlayer.onPlayerError.listen((msg) {
print('audioPlayer error : $msg');
setState(() {
_playerState = PlayerState.stopped;
_duration = Duration(seconds: 0);
_position = Duration(seconds: 0);
});
});
_audioPlayer.onPlayerStateChanged.listen((state) {
if (!mounted) return;
setState(() {
_audioPlayerState = state;
});
});
_audioPlayer.onNotificationPlayerStateChanged.listen((state) {
if (!mounted) return;
setState(() => _audioPlayerState = state);
});
_playingRouteState = PlayingRouteState.speakers;
}
在您“從有狀態的小部件返回”之后,它將被處理;
它會打電話
@override
void dispose()
你在哪里打電話_audioPlayer.dispose();
我的猜測是在那之后你仍然嘗試使用 _audioPlayer 但它已經關閉
有兩種方法可以解決這個問題
附言。 又一個問題是你在 _audioPlayer 被處理后仍然嘗試使用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.