Flutter中just_audio依赖报错:无法播放本地音频文件
Flutter just_audio播放本地音频找不到文件的问题修复
错误原因分析
- 初始化顺序错误:
initState中先调用了audioPlayer.setAsset(),但此时audioPlayer还未实例化(audioPlayer = AudioPlayer()在之后执行),导致空引用且资源加载逻辑无效。 - 异步方法未等待:
setAsset()是异步方法,未用await等待加载完成,直接调用play()时资源可能还未就绪,触发找不到文件的错误。
修复后完整代码
import 'package:flutter/material.dart'; import 'package:just_audio/just_audio.dart'; class AudioPlayerScreen extends StatefulWidget { const AudioPlayerScreen({Key? key}) : super(key: key); @override _AudioPlayerScreenState createState() => _AudioPlayerScreenState(); } class _AudioPlayerScreenState extends State<AudioPlayerScreen> { late AudioPlayer audioPlayer; bool isPlaying = false; @override void initState() { super.initState(); // 先初始化播放器实例 audioPlayer = AudioPlayer(); // 异步加载音频资源 _loadAudioAsset(); } // 封装异步加载资源的方法,添加错误捕获 Future<void> _loadAudioAsset() async { try { await audioPlayer.setAsset('assets/music/song1.mp3'); } catch (e) { print('加载音频失败: $e'); // 可在此添加错误提示UI,比如SnackBar } } @override void dispose() { audioPlayer.dispose(); super.dispose(); } void playMusic() async { try { await audioPlayer.play(); setState(() { isPlaying = true; }); } catch (e) { print('播放失败: $e'); } } void pauseMusic() { audioPlayer.pause(); setState(() { isPlaying = false; }); } void stopMusic() async { await audioPlayer.stop(); setState(() { isPlaying = false; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('音频播放器'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ isPlaying ? ElevatedButton( onPressed: pauseMusic, child: const Icon(Icons.pause_circle), ) : ElevatedButton( onPressed: playMusic, child: const Icon(Icons.play_circle), ), const SizedBox(height: 16), ElevatedButton( onPressed: stopMusic, child: const Icon(Icons.stop_circle), ), ], ), ), ); } }
额外检查点
- 确认
assets/music/song1.mp3文件真实存在,路径大小写与代码完全一致(Flutter对路径大小写敏感)。 - 执行
flutter pub get确保依赖正确安装。 - 若问题仍存在,执行
flutter clean清理缓存后重新运行项目。
内容的提问来源于stack exchange,提问作者Ernesto Mendoza
相关产品推荐
相关产品推荐

