升级just_audio至最新版后AudioPlaybackState找不到,该用什么替代?
问题背景
升级老旧项目的just_audio插件至最新版本后,代码中AudioPlaybackState类型提示未定义,原有状态映射逻辑报错,无法找到可直接替换的枚举类型。
原有报错代码如下:
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:just_audio/just_audio.dart'; import 'package:online_radio/radio/radio_player.dart'; import 'package:online_radio/radio/radio_state.dart'; class JustAudioPlayer extends RadioPlayer { final AudioPlayer _audioPlayer = AudioPlayer(); Stream<RadioState> radioStateStream; JustAudioPlayer() { radioStateStream = _audioPlayer.playbackStateStream.map(_mapToRadioState); } @override Future<void> setUrl(String url) async { return _audioPlayer.setUrl(url); } @override Future<void> play({@required String url}) async { return _audioPlayer.play(); } @override Future<void> pause() { return _audioPlayer.pause(); } RadioState _mapToRadioState(AudioPlaybackState audioState) { switch (audioState) { case AudioPlaybackState.none: case AudioPlaybackState.stopped: return RadioState.STOPPED; case AudioPlaybackState.paused: return RadioState.PAUSED; case AudioPlaybackState.playing: return RadioState.PLAYING; default: return RadioState.UNKNOWN; } } }
对应报错截图:

报错原因
just_audio在0.18.0及之后的版本中,完全移除了旧版的AudioPlaybackState枚举,同时调整了状态监听的API:
- 原
playbackStateStream被废弃,替换为playerStateStream - 流抛出的类型不再是单一的播放状态枚举,而是
PlayerState对象,需要结合对象内的processingState(加载处理状态)和playing(是否处于播放指令状态)两个属性判断实际播放状态。
修复代码
新旧版本状态对应关系如下:
- 原
AudioPlaybackState.none、AudioPlaybackState.stopped:对应ProcessingState.idle(初始未加载/调用stop方法后)、ProcessingState.completed(资源播放完成自然终止) - 原
AudioPlaybackState.paused:对应ProcessingState.ready(资源加载完成可播放)且playing值为false - 原
AudioPlaybackState.playing:对应ProcessingState.ready且playing值为true - 其余缓冲中、加载中、连接错误状态,统一走原有逻辑返回
RadioState.UNKNOWN
修改后可正常运行的代码:
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:just_audio/just_audio.dart'; import 'package:online_radio/radio/radio_player.dart'; import 'package:online_radio/radio/radio_state.dart'; class JustAudioPlayer extends RadioPlayer { final AudioPlayer _audioPlayer = AudioPlayer(); Stream<RadioState> radioStateStream; JustAudioPlayer() { // 替换为新版的playerStateStream radioStateStream = _audioPlayer.playerStateStream.map(_mapToRadioState); } @override Future<void> setUrl(String url) async { return _audioPlayer.setUrl(url); } @override Future<void> play({@required String url}) async { return _audioPlayer.play(); } @override Future<void> pause() { return _audioPlayer.pause(); } // 入参替换为新版的PlayerState类型 RadioState _mapToRadioState(PlayerState playerState) { final processingState = playerState.processingState; final isPlaying = playerState.playing; // 匹配停止状态 if (processingState == ProcessingState.idle || processingState == ProcessingState.completed) { return RadioState.STOPPED; } // 资源就绪时根据播放标识判断是播放还是暂停 if (processingState == ProcessingState.ready) { return isPlaying ? RadioState.PLAYING : RadioState.PAUSED; } // 其余状态统一返回未知 return RadioState.UNKNOWN; } }
内容的提问来源于stack exchange,提问作者aneebhiba614
相关产品推荐
相关产品推荐

