Flutter录音页面实现自动启动录制及点击启停的问题
问题解决:页面打开自动启动音频录制
问题根源
你在initState中直接调用record()时,initRecorder()是异步方法,此时还未执行完成,isRecorderReady仍为false,导致record()直接返回,无法启动录制。
修改方案
1. 重构初始化逻辑,确保初始化完成后启动录制
将初始化和启动录制的逻辑放到一个异步方法中,在initState中调用该方法:
@override void initState() { super.initState(); _initAndStartRecording(); } Future _initAndStartRecording() async { try { await initRecorder(); await record(); setState(() {}); // 更新状态,让UI同步录制状态 } catch (e) { print('初始化或启动录制失败: $e'); // 可添加权限拒绝后的提示逻辑,比如弹出SnackBar } }
2. (可选)优化initRecorder方法,直接在内部启动录制
也可以在initRecorder完成后直接调用record():
Future initRecorder() async { final status = await Permission.microphone.request(); if (status != PermissionStatus.granted) { // 替换throw为友好提示,避免应用崩溃 ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('需要麦克风权限才能录制音频')), ); return; } await recorder.openRecorder(); isRecorderReady = true; recorder.setSubscriptionDuration(const Duration(milliseconds: 500)); // 初始化完成后启动录制 await record(); setState(() {}); }
3. 修复时长判断逻辑(潜在问题)
原代码中twoDigitSeconds是字符串,和FFAppState().AudioMaxDuration(应为int类型)直接字符串比较会出错,比如时长为5秒时,twoDigitSeconds是"05",和"5"不相等,需转换为int后比较:
if (duration.inSeconds.remainder(60) == FFAppState().AudioMaxDuration) { await stop(); }
最终效果
- 打开页面后,会先请求麦克风权限,权限通过后自动启动录制
- 点击按钮停止录制,再次点击按钮重新启动录制
- UI会同步更新录制状态(图标切换、时长显示)
内容的提问来源于stack exchange,提问作者nischal nayak
相关产品推荐
相关产品推荐

