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

Flutter生产环境日志:如何获取未处理错误的异常Widget/类信息

Flutter捕获未处理错误时获取Widget/类信息的方法

你当前的问题在于没有正确解析FlutterErrorDetails里的诊断信息,尤其是informationCollector是一个返回诊断节点列表的闭包,直接调用toString()只能得到闭包描述,无法拿到实际的Widget层级数据。以下是具体解决方法:

1. 正确解析诊断信息

errorDetails.informationCollector()会返回包含Widget树、渲染上下文的List<DiagnosticsNode>,你需要遍历这些节点并展开详细信息,而不是直接打印闭包本身。

2. 修改后的实现代码

FlutterError.onError = (FlutterErrorDetails errorDetails) {
  print('Will log here ${errorDetails.exception.toString()}');
  
  final userInfoBox = Hive.box('userInfoBox');
  bool logMode = userInfoBox.get('logModeEnabled');
  
  if (logMode == true) {
    // 打印基础错误信息
    MyLogger.error('Unhandled exception - ${errorDetails.exception.toString()}');
    MyLogger.error('Error context - ${errorDetails.context.toString()}');
    MyLogger.error('Source library - ${errorDetails.library.toString()}');
    
    // 解析并打印诊断信息(包含Widget层级)
    final diagnosticNodes = errorDetails.informationCollector?.call() ?? [];
    for (final node in diagnosticNodes) {
      // 使用toStringDeep()获取完整的节点层级信息
      MyLogger.error('Diagnostic detail:\n${node.toStringDeep()}');
    }
    
    // 打印堆栈信息(如果有)
    if (errorDetails.stack != null) {
      MyLogger.error('Stack trace:\n${errorDetails.stack.toString()}');
    }
  }
  
  // 处理上报数据,同样解析诊断信息
  final diagnosticNodes = errorDetails.informationCollector?.call() ?? [];
  final diagnosticDetails = diagnosticNodes.map((node) => node.toStringDeep()).join('\n');
  
  locator<TelemetryRepository>().processTelemetryData(
    loggingCode: '00010',
    incomingPayload: {
      'error': errorDetails.exception.toString(),
      'context': errorDetails.context.toString(),
      'library': errorDetails.library.toString(),
      'diagnostic_details': diagnosticDetails,
      'stack_trace': errorDetails.stack?.toString() ?? 'No stack trace available',
    },
  );
};

3. 定位引发异常的Widget

在解析后的诊断信息中,你可以找到以下关键内容:

  • Widget层级链:从根Widget到引发错误的具体Widget的完整路径,包含每个Widget的类型和关键属性
  • 渲染上下文信息:比如RenderFlex溢出错误会明确指出哪个RenderObject出现问题,以及对应的Widget
  • 创建位置追踪:部分诊断节点会包含Widget创建的代码位置(如果开启了Widget追踪)

4. 额外优化建议

  • 本地调试时,可以直接调用FlutterError.dumpErrorToConsole(errorDetails),快速输出完整的错误信息到控制台
  • 生产环境下,建议将诊断信息格式化后压缩上报,避免日志体积过大

内容的提问来源于stack exchange,提问作者Nicolas Zein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:42:04