Flutter Audio Waveforms包无法显示音频波形问题求助
解决audio_waveforms波形不显示及bufferData为null的问题
核心问题分析
你的代码存在几个关键问题导致波形无法加载:
preparePlayer是异步操作,未等待完成就访问bufferData- 文件列表初始化未正确处理异步逻辑,导致文件加载不及时
- PlayerController未在dispose时释放资源
解决方案及代码修改
1. 等待preparePlayer完成后再访问bufferData
修改AudioWaveFormsWidget中的_preparePlayer方法,用await等待异步操作完成,确保bufferData被正确加载后再更新UI:
void _preparePlayer() async { bool exist = await widget.path.exists(); if (exist) { await playerController1.preparePlayer(widget.path.path); if (mounted) setState(() {}); print("--------------------------------${playerController1.bufferData}"); } }
2. 修复文件列表的异步初始化
修改MyHomePage中的initFileInDir方法,确保所有文件加载完成后再更新UI:
void initFileInDir() async { Directory finalPath = await _getDir(); var exists = await finalPath.exists(); if (exists) { await for (var element in finalPath.list(recursive: false)) { if (element is File) { _audioFile.add(element); } } if (mounted) setState(() {}); } }
同时在initState中直接调用异步方法,无需嵌套setState:
@override void initState() { super.initState(); _recordSub = record.onStateChanged().listen((recordState) { setState(() => _recordState = recordState); }); initCheckPermission(); initFileInDir(); }
3. 释放PlayerController资源
在_AudioWaveFormsWidgetState的dispose方法中添加PlayerController的释放,避免内存泄漏:
@override void dispose() { playerController1.dispose(); super.dispose(); }
4. 验证文件格式兼容性
尝试将录制格式改为wav测试,确认是否是编码兼容问题:
await record.start( path: '${finalPath.path}/${DateTime.now().millisecondsSinceEpoch}.wav', encoder: AudioEncoder.wav, bitRate: 128000, samplingRate: 44100, );
额外注意事项
- Android 13+需使用
Permission.manageExternalStorage申请文件访问权限,替代旧的Permission.storage - 检查音频文件是否损坏,可通过其他播放器打开确认文件完整性
内容的提问来源于stack exchange,提问作者frank tchapo
相关产品推荐
相关产品推荐

