From 66dbc4829cb2a0c303b91731b13f90697df1fd44 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Thu, 30 Apr 2026 19:58:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(client):=20=E4=BF=AE=E5=A4=8D=20web=20?= =?UTF-8?q?=E7=AB=AF=E9=80=89=E6=8B=A9=E6=96=87=E4=BB=B6=E5=90=8E=E6=97=A0?= =?UTF-8?q?=E5=8F=8D=E5=BA=94=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 result.files.isEmpty 检查(web file_picker 偶发空列表) - web 平台不传 initialDirectory(避免潜在兼容性问题) - 添加 mounted 检查和 try-catch,异常通过 SnackBar 显示 Co-Authored-By: Claude Sonnet 4.6 --- .../lib/screens/settings/settings_screen.dart | 51 +++++++++++-------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/client/lib/screens/settings/settings_screen.dart b/client/lib/screens/settings/settings_screen.dart index 32c7bd8..a77cddd 100644 --- a/client/lib/screens/settings/settings_screen.dart +++ b/client/lib/screens/settings/settings_screen.dart @@ -1,5 +1,6 @@ import 'package:dio/dio.dart'; import 'package:file_picker/file_picker.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter/services.dart'; @@ -1460,29 +1461,39 @@ class _BatchImportWidgetState extends ConsumerState<_BatchImportWidget> { } Future _pickFile(int index) async { - final result = await FilePicker.platform.pickFiles( - type: FileType.custom, - allowedExtensions: ['xls', 'xlsx'], - withData: true, - initialDirectory: _lastDir, - ); - if (result == null) return; + try { + final result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ['xls', 'xlsx'], + withData: true, + initialDirectory: kIsWeb ? null : _lastDir, + ); + if (result == null || result.files.isEmpty) return; - // 保存目录供下次使用 - final path = result.files.first.path; - if (path != null) { - final dir = path.contains('/') ? path.substring(0, path.lastIndexOf('/')) : null; - if (dir != null) { - _lastDir = dir; - SharedPreferences.getInstance().then((p) => p.setString(_prefKey, dir)); + // 保存目录供下次使用(仅非 web 平台) + if (!kIsWeb) { + final path = result.files.first.path; + if (path != null) { + final dir = path.contains('/') ? path.substring(0, path.lastIndexOf('/')) : null; + if (dir != null) { + _lastDir = dir; + SharedPreferences.getInstance().then((p) => p.setString(_prefKey, dir)); + } + } } - } - setState(() { - _slots[index].file = result.files.first; - _slots[index].success = null; - _slots[index].error = null; - }); + if (!mounted) return; + setState(() { + _slots[index].file = result.files.first; + _slots[index].success = null; + _slots[index].error = null; + }); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('选择文件失败:$e')), + ); + } } Future _runImport() async {