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

Flutter使用audioplayers包点击按钮播放音符提示play方法无效

问题根源

旧教程适配的是audioplayers 3.x及更早版本,从4.0版本开始,该包做了破坏性API更新:原AudioCache类上的play方法被完全移除,播放相关能力全部收归到AudioPlayer类实现,AudioCache目前仅负责资源加载、缓存管理逻辑,不再直接提供播放触发能力,因此调用时会抛出方法不存在的错误。

修复方案
  • 无需调整pubspec.yaml中的assets配置,原有音频文件存放规则保持不变
  • 不要在按钮onPressed回调内反复创建播放器实例,将AudioPlayer实例提前初始化、全局复用,避免不必要的资源开销和内存泄漏
  • 播放项目内asset音频时,直接向AudioPlayer的play方法传入AssetSource(音频路径)即可,无需单独实例化AudioCache做中转
修正后可直接运行的代码
import 'package:flutter/material.dart';
import 'package:audioplayers/audioplayers.dart';

void main() => runApp(const XylophoneApp());

class XylophoneApp extends StatelessWidget {
  const XylophoneApp({super.key});

  // 提前实例化播放器复用,请勿放在onPressed回调内重复创建
  final AudioPlayer player = AudioPlayer();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: Center(
            child: TextButton(
              onPressed: () async {
                // 每次点击从头播放,避免上一次播放未结束导致无响应
                await player.stop();
                // 新版播放asset音频的标准写法
                await player.play(AssetSource('note1.wav'));
              },
              child: const Text('Click Me'),
            ),
          ),
        ),
      ),
    );
  }
}
补充说明

如果需要降低点击按钮后的播放延迟,可以在页面初始化阶段提前调用await player.setSource(AssetSource('note1.wav'));预加载音频资源。
5.x及以上最新稳定版中,AssetSource会自动完成资源路径映射、缓存读取逻辑,和旧版AudioCache的资源查找规则完全一致,不需要额外做路径适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:48:21