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

Flutter实现通过代码更新TextField显示滚动调试信息

实现Flutter录制调试日志展示方案

步骤1:添加依赖

在pubspec.yaml里加入circular_buffer包:

dependencies:
  flutter:
    sdk: flutter
  record: ^最新版本
  path_provider: ^最新版本
  intl: ^最新版本
  circular_buffer: ^最新版本

步骤2:修改状态类,集成环形缓冲区

在myAppState里添加变量和方法管理日志:

class myAppState extends State<myApp> {
  final record = Record();
  bool bPressed = false;
  // 环形缓冲区,最多存10条日志(可按需调整)
  final CircularBuffer<String> _logBuffer = CircularBuffer(10);
  // TextField显示的拼接日志文本
  String _logText = '';
  // 记录录制开始时间,用于计算时长
  DateTime? _recordingStartTime;

  @override
  void initState() {
    super.initState();
    _updateLogDisplay();
  }

  // 添加日志并更新UI
  void _addLog(String message) {
    setState(() {
      _logBuffer.add(message);
      _updateLogDisplay();
    });
  }

  // 将缓冲区内容转为多行文本
  void _updateLogDisplay() {
    _logText = _logBuffer.toList().join('\n');
  }

  // 原有代码保持不变
}

步骤3:修改录制逻辑,添加日志

更新action方法,在录制关键节点生成日志:

Future<void> action() async {
  bool isRecording = await record.isRecording();

  if (await record.hasPermission()) {
    if (isRecording) {
      // 停止录制时生成日志
      await record.stop();
      final duration = DateTime.now().difference(_recordingStartTime!);
      _addLog('录制结束:${DateFormat('HH:mm:ss').format(DateTime.now())},时长:${duration.inSeconds}秒');
      _recordingStartTime = null;
    } else {
      // 开始录制时生成日志
      _recordingStartTime = DateTime.now();
      Directory appDocDir = await getApplicationDocumentsDirectory();
      String appDocPath = appDocDir.path;
      String outFile = "$appDocPath/${getTimestampSec()}_ambient_test.m4a";
      _addLog('录制开始:${DateFormat('HH:mm:ss').format(_recordingStartTime!)},文件路径:$outFile');

      await record.start(
        path: outFile,
        encoder: AudioEncoder.aacLc,
        bitRate: 128000,
        samplingRate: 44100,
      );
    }
  }

  _addLog('按钮点击:${bPressed ? "开始录制" : "停止录制"}');
}

步骤4:添加底部日志展示组件

修改build方法,在页面底部加入只读TextField:

@override
Widget build(BuildContext context) {
  return MaterialApp(
    title: 'Record',
    home: Scaffold(
      appBar: AppBar(
        title: const Text('Record'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            child: bPressed ? const Text("Stop") : const Text("Record"),
            onPressed: () {
              setState(() {
                bPressed = !bPressed;
              });
              action();
            },
          ),
          if (bPressed)
            ElapsedTime(timestamp: DateTime.now().toString())
          else
            const Text(""),
          // 底部日志展示区
          Expanded(
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                controller: TextEditingController(text: _logText),
                maxLines: null,
                readOnly: true,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: '调试日志',
                ),
              ),
            ),
          ),
        ],
      ),
    ),
  );
}

关键说明

  • 环形缓冲区会自动维护固定数量的日志,超过上限时自动删除最旧条目,避免日志过载
  • _addLog方法内调用setState,确保日志更新后UI自动刷新
  • 通过记录开始时间、结束时计算时间差得到录制时长,用intl包格式化时间戳提升可读性
  • 日志TextField设为只读,maxLines: null支持自动换行

内容的提问来源于stack exchange,提问作者Pat Eitsch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:30:42