You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FlutterSound 9.0.0中onPlayerStateChange未定义错误解决求助

解决FlutterSound 9.0.0中播放器状态监听的报错问题

核心版本变更说明

FlutterSound 9.x 对播放器的状态管理做了彻底重构:

  • 移除了旧版本的onPlayerStateChanged/onPlayerStateChange流
  • 新增playerState流作为状态监听的唯一入口
  • 状态数据不再需要自定义PlayStatus,改用库内置的PlayerState类,该类包含:
    • state:枚举值,直接标记当前播放状态(PlayerState.playing/paused/stopped等)
    • position:当前播放位置
    • duration:音频总时长

代码修改步骤

  1. 移除自定义的PlayStatus类
    库已经提供了内置的PlayerState,不需要自行定义。

  2. 修正订阅类型与监听逻辑
    将原来的StreamSubscription<PlayStatus>改为StreamSubscription<PlayerState>,并替换监听的流为_audioPlayer.playerState:

    late StreamSubscription<PlayerState> _playerSubscription;
    
    @override
    void initState() {
      super.initState();
      _audioPlayer = FlutterSoundPlayer();
      _checkConnectivity();
      // 9.x版本建议显式初始化音频会话
      _initAudioSession();
    
      _playerSubscription = _audioPlayer.playerState.listen((PlayerState state) {
        // 通过枚举直接判断播放状态
        setState(() {
          isPlaying = state.state == PlayerState.playing;
        });
        // 判断播放完成
        if (state.position != null && state.duration != null) {
          if (state.position >= state.duration!) {
            setState(() {
              isPlaying = false;
            });
          }
        }
      });
    }
    
    // 新增音频会话初始化方法
    Future<void> _initAudioSession() async {
      await _audioPlayer.openAudioSession();
    }
    
  3. 修正dispose逻辑
    9.x版本需要显式关闭音频会话,避免资源泄漏:

    @override
    void dispose() {
      _playerSubscription.cancel();
      _audioPlayer.closeAudioSession();
      super.dispose();
    }
    
  4. 优化播放控制逻辑(可选)
    利用PlayerState的枚举可以更精准地控制播放状态,比如_playPause方法可以改为:

    void _playPause() async {
      final currentState = _audioPlayer.playerState.value.state;
      if (currentState == PlayerState.playing) {
        await _audioPlayer.pausePlayer();
      } else if (currentState == PlayerState.paused) {
        await _audioPlayer.resumePlayer();
      } else {
        await _play();
      }
    }
    

关键注意点

  • 9.x版本中startPlayer的参数基本兼容旧代码,若遇到播放失败可检查codec参数是否匹配音频流格式
  • 必须在使用播放器前调用openAudioSession(),否则可能出现初始化失败问题

内容的提问来源于stack exchange,提问作者David jorge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:22:49