簡體   English   中英

未處理的異常:錯誤 state:調用關閉音頻播放器后無法添加新事件

[英]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 但它已經關閉

有兩種方法可以解決這個問題

  1. 創建新實例 _audioPlayer 並使用它
  2. 將 _audioPlayer 保存在 App 之類的小部件中,這樣當用戶在應用程序中時,您將始終保持它“活動”

附言。 又一個問題是你在 _audioPlayer 被處理后仍然嘗試使用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM