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
相关产品推荐
相关产品推荐

