【问题标题】:Unhandled Exception: Bad state: Cannot add new events after calling close Audio player未处理的异常:错误状态:调用关闭音频播放器后无法添加新事件
【发布时间】:2020-05-17 10:32:47
【问题描述】:

对于我的应用程序,我使用包 audioplayers(https://pub.dev/packages/audioplayers),当我启动音频并从有状态小部件返回时,我的问题是这样的错误:未处理的异常:错误状态:调用关闭后无法添加新事件当我回去时,我的音频丢失了,但我无法停止音频。我不知道该怎么办,谁能帮帮我。

    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;
  }

【问题讨论】:

    标签: flutter audio dispose


    【解决方案1】:

    在你“从一个有状态的小部件返回”之后,它会被处理掉;

    它会调用

    @override
    void dispose()
    

    你打电话给_audioPlayer.dispose();,我猜在那之后你仍然尝试使用_audioPlayer,但它已经关闭了

    有两种方法可以解决这个问题

    1. 创建新实例 _audioPlayer 并使用它
    2. 将 _audioPlayer 保存在 App 等小部件中,这样当用户在应用中时,您将始终保持它“活跃”

    附言。还有一个问题是您在处理 _audioPlayer 后仍在尝试使用它

    【讨论】:

    • 对不起,你能帮我写代码吗,我是 Flutter 的新手,在这个包中遇到了很大的问题。我尝试你的方法,默认情况下我看到这个错误:未处理的异常:'package:flutter/src/widgets/framework.dart':断言失败:第 4142 行 pos 12:'_debugLifecycleState != _ElementLifecycle.defunct':不正确。
    • 如果您在使用该软件包时遇到很多问题,我建议您在 github.com/luanpotter/audioplayers/issues 上打开问题,我确定您是否会提供复制步骤,有些人会帮助您
    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2021-07-14
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多