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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:54:23