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
相关产品推荐
相关产品推荐

