FlutterSound 9.0.0中onPlayerStateChange未定义错误解决求助
解决FlutterSound 9.0.0中播放器状态监听的报错问题
核心版本变更说明
FlutterSound 9.x 对播放器的状态管理做了彻底重构:
- 移除了旧版本的
onPlayerStateChanged/onPlayerStateChange流 - 新增
playerState流作为状态监听的唯一入口 - 状态数据不再需要自定义
PlayStatus,改用库内置的PlayerState类,该类包含:state:枚举值,直接标记当前播放状态(PlayerState.playing/paused/stopped等)position:当前播放位置duration:音频总时长
代码修改步骤
移除自定义的
PlayStatus类
库已经提供了内置的PlayerState,不需要自行定义。修正订阅类型与监听逻辑
将原来的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(); }修正dispose逻辑
9.x版本需要显式关闭音频会话,避免资源泄漏:@override void dispose() { _playerSubscription.cancel(); _audioPlayer.closeAudioSession(); super.dispose(); }优化播放控制逻辑(可选)
利用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
相关产品推荐
相关产品推荐

