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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:40:49