// file_utils.dart import 'dart:async'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:file_picker/file_picker.dart'; import 'package:win_text_editor/framework/controllers/logger.dart'; class FileUtils { static Future pickFile(BuildContext context) async { try { final result = await FilePicker.platform.pickFiles(type: FileType.any, allowMultiple: false); return result?.files.single.path; } catch (e) { Logger().error('选择文件失败: ${e.toString()}'); if (context.mounted) { ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text('选择文件失败: ${e.toString()}'))); } return null; } } static Future readFileContent( BuildContext context, String filePath, { Duration timeout = const Duration(seconds: 30), }) async { try { final content = await File(filePath).readAsString().timeout( timeout, onTimeout: () { throw TimeoutException('文件加载超时,可能文件过大'); }, ); return content; } on FormatException { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('这不是可读的文本文件'))); } return null; } on FileSystemException catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('文件访问错误: ${e.message}'))); } return null; } catch (e) { Logger().error('读取文件失败: ${e.toString()}'); if (context.mounted) { ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text('读取失败: ${e.toString()}'))); } return null; } } // 移除showLoadingDialog方法,因为现在直接在调用处处理 }