import 'dart:io'; import 'package:path/path.dart' as p; /// 文件日志工具类 - 用于诊断 UI 卡死问题 /// /// 将关键操作的时间戳写入 日志.log 文件,方便排查问题 /// 使用全局开关控制是否启用日志写入 class KRFileLogger { static const String _logFileName = '日志.log'; /// 🔧 全局日志开关 - 修改为 true 可启用文件日志写入 static const bool _enableFileLogging = true; // ⚠️ 调试模式:开启日志分析UI阻塞 // ← 诊断完成后改回 false static File? _logFile; /// 初始化日志文件(应用启动时调用) static Future initialize() async { if (!_enableFileLogging) return; try { // 获取应用根目录(Windows 下通常是 exe 所在目录) final appDir = Directory.current; final logPath = p.join(appDir.path, _logFileName); _logFile = File(logPath); // 如果日志文件已存在且大于 5MB,清空它 if (await _logFile!.exists()) { final stat = await _logFile!.stat(); if (stat.size > 5 * 1024 * 1024) { // 5MB await _logFile!.writeAsString(''); await _writeRaw('=== 日志文件已清空(超过 5MB)===\n'); } } await _writeRaw('=== 日志系统初始化 - ${DateTime.now().toIso8601String()} ===\n'); } catch (e) { // 初始化失败,静默处理,不影响应用 } } /// 写入日志(带时间戳) static Future log(String message) async { if (!_enableFileLogging || _logFile == null) return; try { final timestamp = DateTime.now().toIso8601String(); final logLine = '[$timestamp] $message\n'; await _logFile!.writeAsString(logLine, mode: FileMode.append); } catch (e) { // 日志写入失败,静默处理,不要破坏主流程 } } /// 直接写入原始内容(用于特殊格式) static Future _writeRaw(String content) async { if (!_enableFileLogging || _logFile == null) return; try { await _logFile!.writeAsString(content, mode: FileMode.append); } catch (e) { // 日志写入失败,静默处理 } } /// 写入分隔线(用于区分不同的操作) static Future separator() async { if (!_enableFileLogging) return; await _writeRaw('\n---\n'); } /// 清空日志文件 static Future clear() async { if (!_enableFileLogging || _logFile == null) return; try { await _logFile!.writeAsString(''); await _writeRaw('=== 日志已清空 - ${DateTime.now().toIso8601String()} ===\n'); } catch (e) { // 清空失败,静默处理 } } }